#查看PHP模块列表
dnf module list php
#重置PHP模块
dnf module reset php
#设置对应该的模块版本
dnf module enable php:7.4
#安装PHP
dnf install php
#查看安装的版本
php -v
标签:PHP
PHP PECL 扩展库安装
https://pecl.php.net/
PECL is a repository for PHP Extensions, providing a directory of all known extensions
搜索下载对应的PHP扩展库原码
#如果不安装php-devel就不会有phpize和php-config
/usr/bin/phpize # php安装后的路径(不知道位置的可以whereis phpize 查看位置)
./configure --with-php-config=/usr/bin/php-config
make && make install
修改php.ini文件 , 增加如下内容:
extension=XXX.so #增加对应的扩展库名
重启php-fpm: 或httpd
systemctl restart php-fpm
OR
systemctl restart httpd
pkgs.org – Linux Packages Search
pkgs.org – Linux Packages Search
The pkgs.org is created to provide you with the simplest method of searching and downloading
the newest versions of the Linux packages without the usual excessive popups or spyware.
今天发现了个好网站,LINUX RPM包的全库,包函了各大LINUX版本,几乎所有的常用包,测试可用,很方便安装
XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin
解决办法:
1.恳求的url是PHP的,须要PHP中
2.html的,须要在head头加
这样就可以解决Ajax跨域访问问题。
在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC(可选的PHP缓存)
在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC
APC(可选的PHP缓存)是一个免费,开源的PHP代码缓存。这个模块的主要目的是提供一个健壮的框架来缓存和优化PHP代码。
在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC
在Linux上安装和开启PHP APC
该说明文档描述了如何在RHEL 6.3/6.2/6.1/6/5.8/5.6,CentOS 6.3/6.2/6.1/6/5.8/5.6和Fedora 17,16,15,14,13,12上使用PECL命令从代码仓库中下载,安装以及开启APC。
安装APC的依赖包
首先,我们需要安装所需的软件包,pecl,phpize和apxs命令,并使用YUM包管理工具来安装APC。
yum install php-pear php-devel httpd-devel pcre-devel gcc make
使用PECL安装APC
现在我们已经安装了所有必须的软件包以用来安装APC。接下来我们使用PECL命令来安装它。安装过程中请选择默认的设置值。
pecl install apc
输出如下:
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update downloading APC-3.1.9.tgz ... Starting to download APC-3.1.9.tgz (155,540 bytes) .................................done: 155,540 bytes 54 source files, building running: phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 config.m4:180: warning: AC_CACHE_VAL(PHP_APC_GCC_ATOMICS, ...): suspicious cache-id, must contain _cv_ to be cached ../../lib/autoconf/general.m4:1974: AC_CACHE_VAL is expanded from... ../../lib/autoconf/general.m4:1994: AC_CACHE_CHECK is expanded from... config.m4:180: the top level config.m4:180: warning: AC_CACHE_VAL(PHP_APC_GCC_ATOMICS, ...): suspicious cache-id, must contain _cv_ to be cached ../../lib/autoconf/general.m4:1974: AC_CACHE_VAL is expanded from... ../../lib/autoconf/general.m4:1994: AC_CACHE_CHECK is expanded from... config.m4:180: the top level Enable internal debugging in APC [no] : Enable per request file info about files used from the APC cache [no] : Enable spin locks (EXPERIMENTAL) [no] : Enable memory protection (EXPERIMENTAL) [no] : Enable pthread mutexes (default) [yes] : Enable pthread read/write locks (EXPERIMENTAL) [no] :
开启PHP的APC扩展模块
运行下面的命令以开启APC扩展模块在Apache配置中
echo "extension=apc.so" > /etc/php.d/apc.ini
重启Apache服务
重启Apache服务以使新的更改生效。
service httpd restart OR /etc/init.d/httpd restart
在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC
开启PHP APC管理
开启APC管理面板,你需要复制下面的文件:
cp /usr/share/pear/apc.php /var/www/html/
接下来打开apc.php文件
# vi /var/www/html/apc.php
如下所示,在apc.php文件中设置用户名及密码。
defaults('ADMIN_USERNAME','apc'); // Admin Username defaults('ADMIN_PASSWORD','Set-Password-Here'); // Admin Password - CHANGE THIS TO ENABLE!!!
在浏览器中输入如下的URL链接,你将可以使用APC的管理面板。
http://localhost/apc.php
在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC
使用PECL升级APC
执行如下的命令即可下载并升级APC
pecl upgrade apc
使用PECL卸载APC
如果你想移除它,使用如下的命令即可从你的系统中完全移除APC。
pecl uninstall apc
cURL超时设置
一般我们访问HTTP方式很多,主要是:curl, socket, file_get_contents() 等方法。
如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。
CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。
curl_setopt($ch, opt) 可以设置一些超时的设置,主要包括:
*(重要) CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数。
*(重要) CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数。
(在cURL 7.16.2中被加入。从PHP 5.2.3起可使用)
CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。
(在cURL 7.16.2中被加入。从PHP 5.2.3开始可用)
CURLOPT_DNS_CACHE_TIMEOUT 设置在内存中保存DNS信息的时间,默认为120秒。
curl普通秒级超时:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT,60); //只需要设置一个秒的数量就可以 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);
curl如果需要进行毫秒超时,需要增加:
curl_easy_setopt(curl, CURLOPT_NOSIGNAL,1L); //或者是: curl_setopt ( $ch, CURLOPT_NOSIGNAL,true);//是可以支持毫秒级别超时设置的
curl一个毫秒级超时的例子:
if(!isset($_GET['foo'])){ // Client $ch = curl_init('http://example.com/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_NOSIGNAL,1); //注意,毫秒超时一定要设置这个 curl_setopt($ch, CURLOPT_TIMEOUT_MS,200); //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用 $data = curl_exec($ch); $curl_errno = curl_errno($ch); $curl_error = curl_error($ch); curl_close($ch); if($curl_errno >0){ echo "cURL Error ($curl_errno): $curl_error\n"; }else{ echo "Data received: $data\n"; } }else{ // Server sleep(10); echo "Done."; }
其他一些技巧:
1. 按照经验总结是:cURL 版本 >= libcurl/7.21.0 版本,毫秒级超时是一定生效的,切记。
2. curl_multi的毫秒级超时也有问题。。单次访问是支持ms级超时的,curl_multi并行调多个会不准
验证URL字符串的正则
验证URL字符串的正则
^(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(\w+\.))*(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[\d]+)?(/[\w\&%_\./-~-\W]*)?$
在PHP中的写法为:
if(preg_match("@^(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(\w+\.))*(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[\d]+)?(/[\w\&%_\./-~-\W]*)?$@i", $_url))
POST调试工具
实际开发工作中,很多时候需要用到POST提交值,每次都需要针对写出相对的POST环境,
所以写出这个POST调试工具公共库,方便调试使用。
程序运行环境需要php 及 extension=php_curl.dll
调试时填写的内容:
提交的网址:填写需要调试的网址
提交的变量:分别填写变量名及变量值,可以添加多个变量,及多行(TEXT)变量
提交执行提供了正常执行,返回原码,解析JSON,解析XML 多种操作
可以将返回直接显示,也可以解析后直观显示
PHP字符串提取一段文字中的img代码
哈哈!”'; echo $str; preg_match_all('//iUs', $str, $out); print_r($out); $img=$out[0][0]; echo $img; ?>
哈哈”'; preg_match_all('/src="(.*)"/iUs', $str, $out); $img=$out[1][0]; echo $img; ?>
Imghash:相似图片搜索的php实现
前几天看到阮一峰的博客里写到关于相似图片搜索的原理, 里面介绍了Google相似图片搜索的大致原理,主要是从Neal Krawetz博士的LOOKS LIKE IT翻译而来。文章详细的介绍了相似图片搜索处理的相关步骤,并且给出了一个python的实现,由于我对PHP比较熟,所以写了个PHP的版本。
图片相似搜索的简单原理
根据文章里的描述,其实原理比较简单,大致有如下几个步骤:
1、缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。
2、简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
3、计算平均值。计算所有64个像素的灰度平均值。
4、比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。
5、计算哈希值。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。
这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。
图片相似搜索的PHP实现
原文中给出了一个python版本的实现,代码只有53行。我写了个对应的PHP版本,由于直接是用类写的,所以代码有100行,具体如下:
class Imghash{ private static $_instance = null; public $rate = 2; public static function getInstance(){ if (self::$_instance === null){ self::$_instance = new self(); } return self::$_instance; } public function run($file){ if (!function_exists('imagecreatetruecolor')){ throw new Exception('must load gd lib', 1); } $isString = false; if (is_string($file)){ $file = array($file); $isString = true; } $result = array(); foreach ($file as $f){ $result[] = $this->hash($f); } return $isString ? $result[0] : $result; } public function checkIsSimilarImg($imgHash, $otherImgHash){ if (file_exists($imgHash) && file_exists($otherImgHash)){ $imgHash = $this->run($imgHash); $otherImgHash = $this->run($otherImgHash); } if (strlen($imgHash) !== strlen($otherImgHash)) return false; $count = 0; $len = strlen($imgHash); for($i=0;$i<$len;$i++){ if ($imgHash{$i} !== $otherImgHash{$i}){ $count++; } } return $count <= (5 * $rate * $rate) ? true : false; } public function hash($file){ if (!file_exists($file)){ return false; } $height = 8 * $this->rate; $width = 8 * $this->rate; $img = imagecreatetruecolor($width, $height); list($w, $h) = getimagesize($file); $source = $this->createImg($file); imagecopyresampled($img, $source, 0, 0, 0, 0, $width, $height, $w, $h); $value = $this->getHashValue($img); imagedestroy($img); return $value; } public function getHashValue($img){ $width = imagesx($img); $height = imagesy($img); $total = 0; $array = array(); for ($y=0;$y<$height;$y++){ for ($x=0;$x<$width;$x++){ $gray = ( imagecolorat($img, $x, $y) >> 8 ) & 0xFF; if (!is_array($array[$y])){ $array[$y] = array(); } $array[$y][$x] = $gray; $total += $gray; } } $average = intval($total / (64 * $this->rate * $this->rate)); $result = ''; for ($y=0;$y<$height;$y++){ for ($x=0;$x<$width;$x++){ if ($array[$y][$x] >= $average){ $result .= '1'; }else{ $result .= '0'; } } } return $result; } public function createImg($file){ $ext = $this->getFileExt($file); if ($ext === 'jpeg') $ext = 'jpg'; $img = null; switch ($ext){ case 'png' : $img = imagecreatefrompng($file);break; case 'jpg' : $img = imagecreatefromjpeg($file);break; case 'gif' : $img = imagecreatefromgif($file); } return $img; } public function getFileExt($file){ $infos = explode('.', $file); $ext = strtolower($infos[count($infos) - 1]); return $ext; } }
$instance = ImgHash::getInstance();
$result = $instance->checkIsSimilarImg(‘chenyin/IMG_3214.png’, ‘chenyin/IMG_3212.JPG’);
如果$result值为true, 则表明2个图片相似,否则不相似。
在实际的相似图片搜索中,算图片的指纹并不是难点,难点而是在怎么从海量的图片指纹里找出与之相似的指纹。
Apache2.2整合PHP5.3以上的版本时提示错误Cannot load php5apache2_2.dll into server解决方法
Apache2.2整合PHP5.3以上的版本时提示错误“Cannot load php5apache2_2.dll into server ”
故障现象:
在命令符方式下启动Apache时提示错误信息“httpd: Syntax error on line 129 of D:/serviceRoot/Apache2.2/conf/httpd.conf: Cannot load D:/serviceRoot/PHP5.4.3/php5apache2_2.dll into server”,导致Apache无法启动。
Apache的配置文件D:/Apache/conf/httpd.conf 第129行内容为:
LoadModule php5_module D:/serviceRoot/PHP5.4.3/php5apache2_2.dll
注意:其中D:/serviceRoot/PHP5.4.3/php5apache2_2.dll是我安装php的相应路径。Apache为2.2.22版本,php为5.4.3版本。
出现错误的原因:
在网上查到一位朋友遇到类似情况,并提示根据PHP的安装文件名称“php-5.3.6-Win32-VC9-x86.zip”得知该版本的PHP安装文件是由VC编译完成的,因此如需要运行或调用该PHP压缩包中的相关文件,则需要首先安装VC的运行时环境。如果你的机器没有安装有VC运行时环境,则Apache调用该PHP压缩包中的相关文件时会提示如上错误信息。
解决方法:
在网上搜索“VC2008可再发行组件”或者是“VC2008运行库”,下载安装后即可解决此故障。
PHP 5.5 新增 Generators 特性 yield 标签
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,php 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } echo 'Single digit odd numbers: '; /* 注意保存在内存中的数组绝不会被创建或返回 */ foreach (xrange(1, 9, 2) as $number) { echo "$number "; }
PHP 查询两个字符串的相似度
PHP similar_text() 函数 : similar_text(string1,string2,percent)
以及 levenshtein() 函数 : levenshtein(string1,string2,insert,replace,delete)
两个函数可以计算出两个字符串的相似值,用此两个函数可以进行模糊查询,进行相似度查询。
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如把 kitten 转换为 sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)
levenshtein() 函数给每个操作(替换、插入和删除)相同的权重。不过,您可以通过设置可选的 insert、replace、delete 参数,来定义每个操作的代价。
该函数也可以计算两个字符串的相似度(以百分比计)。
注释:levenshtein() 函数比 similar_text() 函数更快。不过,similar_text() 函数通过更少的必需修改次数提供更精确的结果。
Deprecated: Function ereg() is deprecated的解决方法
这个问题是因为你用的php版本过高。
在php5.3中,正则函数ereg_replace已经废弃,而dedecms还继续用。有两个方案可以解决以上问题:
1、把php版本换到v5.3下。
2、继续使用v5.3,修改php.ini文件
;extension=php_mbstring.dll
改为
extension=php_mbstring.dll
;mbstring.func_overload = 0
修改为:
mbstring.func_overload = 7
或者使用其他的函数:
define(‘DEDEADMIN’, ereg_replace(“[/\\]{1,}”, ‘/’, dirname(__FILE__) ) );
//改为
define(‘DEDEADMIN’, preg_replace(“/[\/\\\\]{1,}/”, ‘/’, dirname(__FILE__) ) );
注:因为preg_replace比ereg_replace的执行速度快,PHP推荐使用preg_replace.
PHP 判断字符串是否为全英文,英汉混合,纯汉字方法
方法一:
function is_chinese($s){ $allen = preg_match("/^[^\x80-\xff]+$/", $s); //判断是否是英文 $allcn = preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/",$s); //是否是中文 if($allen){ return 'allen'; }else{ if($allcn){ return 'allcn'; }else{ return 'encn'; } } }
方法二:
利用Php的mb_strlen和strlen函数就可以轻松得知字符串的构成是全英文、英汉混合、还是纯汉字。简要说明如下(以上示例程序)
1、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度一致,可以判断是纯英文字符串。
2、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度不一致,且strlen返回值同mb_strlen的返回值求余后得0可以判断为是全汉字的字符串。
3、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度不一致,且strlen返回值同mb_strlen的返回值求余后不为0,可以判断为是英汉混合的字符串。
function Check_stringType($str1) { $strA = trim($str1); $lenA = strlen($strA); $lenB = mb_strlen($strA, "utf-8"); if ($lenA === $lenB) { return "1"; //全英文 } else { if ($lenA % $lenB == 0) { return "2"; //全中文 } else { return "3"; //中英混合 } } }