给骨头系统开发的图像库的 imagick 部分 ,支持 gif , 完美支持裁切、生成缩略图、添加水印 。
支持按方位生成缩略图像, 如:
// 把左上角优先 $image->resize_to(100, 100, 'north_west'); // 右边优先 $image->resize_to(100, 100, 'east'); ...
更多参数看源代码
原图
效果图
给骨头系统开发的图像库的 imagick 部分 ,支持 gif , 完美支持裁切、生成缩略图、添加水印 。
支持按方位生成缩略图像, 如:
// 把左上角优先 $image->resize_to(100, 100, 'north_west'); // 右边优先 $image->resize_to(100, 100, 'east'); ...
更多参数看源代码
原图
效果图
image!==null) $this->image->destroy(); } // 载入图像 public function open($path) { $this->image = new Imagick( $path ); if($this->image) { $this->type = strtolower($this->image->getImageFormat()); } return $this->image; } public function crop($x=0, $y=0, $width=null, $height=null) { if($width==null) $width = $this->image->getImageWidth()-$x; if($height==null) $height = $this->image->getImageHeight()-$y; if($width<=0 || $height<=0) return; if($this->type=='gif') { $image = $this->image; $canvas = new Imagick(); $images = $image->coalesceImages(); foreach($images as $frame){ $img = new Imagick(); $img->readImageBlob($frame); $img->cropImage($width, $height, $x, $y); $canvas->addImage( $img ); $canvas->setImageDelay( $im
其实回过头看,安装过程中最容易出错的反而是下载阶段,一定要将imagemagick和imagick的版本和phpinfo
的信息对应好!
下图中几点需要注意,每个人的信息可能不同,根据你自己的phpinfo来选择接下来的下载的程序及扩展版本:
Imagemagick
程序解压缩 将下载后的压缩包,直接解压到你想放置的目录下,不要有中文和特殊字符,我把它放在了D:\install_dir\imagemagick
下,并且记住不要忘记这个路径
环境变量配置 为了更方便,全局都可以使用,我们需要配置下环境变量,进入刚才解压缩的目录,再进入/bin目录下,复制当前路径,我的路径为D:\install_dir\imagemagick\bin
,右击我的电脑(计算机),按照下图依次打开环境变量配置位置,将路径粘贴进去(注意:Path中可能有多个路径,多个路径间用;
分号分割就好)
导入DLL文件 进入imagemagick
的bin
目录下,复制所有.dll
后缀的文件到你的php
根目录下(我使用的是Phpstudy建的环境,我的php
路径为:D:\phpStudy\php\php-5.6.27-nts
)我的版本有147个文件,这里有个小技巧,在文件管理器右上角搜索.dll
,然后全选复制,会方便一点
首先imagick
一个php
扩展,可以使用php
控制imagemagick
程序
p
php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密
1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)
下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:
openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端
2、php中用生成的公钥、私钥进行加密解密,直接上代码
<?php
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
ga63yVSIC8jcODxiuvxJn
Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数。Stream可以翻译为“流”,在Java里,流是一个很重要的概念。
流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。根据流的方向又可以分为输入流和输出流,同时可以在其外围再套上其它流,比如缓冲流,这样就可以得到更多流处理方法。
PHP里的流和Java里的流实际上是同一个概念,只是简单了一点。由于PHP主要用于Web开发,所以“流”这块的概念被提到的较少。如果有Java基础,对于PHP里的流就更容易理解了。其实PHP里的许多高级特性,比如SPL,异常,过滤器等都参考了Java的实现,在理念和原理上同出一辙。
比如下面是一段PHP SPL标准库的用法(遍历目录,查找固定条件的文件):
01 | class RecursiveFileFilterIterator extends FilterIterator |
02 | { |
03 | // 满足条件的扩展名 |
04 | protected $ext = array ( 'jpg' , 'gif' ); |
05 |
06 | /** |
07 | * 提供 $path 并生成对应的目录迭代器 |
08 | */ |
09 | public function __construct( $path ) |
10 | { |
11 | parent::__construct( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ))); |
12 | } |
13 |
14 | /** |
15 | * 检查文件扩展名是否满足条件 |
16 | */ |
17 | public function accept() |
18 | { |
19 | $item = $this ->getInnerIterator(); |
20 | if ( $item ->isFile() && in_array( pathinfo ( $item ->getFilename(), PATHINFO_EXTENSION), $this ->ext)) |
21 | { |
22 | return |
git clone https://github.com/protocolbuffers/protobuf.git
./autogen.sh ./configure --prefix=/usr/local/protobuf make sudo make install
cd protobuf/php/ext/google/protobuf /usr/local/php-7.1.11/bin/phpize ./configure --with-php-config=/usr/local/php-7.1.11/bin/php-config make sudo make install
添加配置:
/usr/local/php-7.1.11/bin/php --ini | grep php.ini sudo vim /usr/local/php-7.1.11/etc/php.ini extension=protobuf.so
编写proto 协议文件
vim User.proto syntax="proto3"; message UserInfo { int32 id = 1; string name = 2; }
用protoc编译协议文件,会在当前目录下生成GPBMetadata目录和UserInfo.php文件
/usr/local/protobuf/bin/protoc --php_out=./ User.proto
安装php库:
composer require google/protobuf
编写php脚本
<?php require('./vendor/autoload.php'); require('./UserInfo.php'); require('./GPBMetadata/User.php'); $pbUserInfo = new UserInfo(); $pbUserInfo->setId(1001); $pbUserInfo->setName('jack'); $str = $pbUserInfo->serializeToString(); $ptTempUser = new UserInfo(); $ptTempUser->mergeFromString($str); var_dump("id:".$
当服务器安装了多个php时候如何切换版本?
1、ps -aux |grep php-fpm 查看是否开启了
php-fpm php-fpm -v 查看php-fpm 启动的php版本(需配置全局变量)
netstat -tunpl|grep php 查看php-fpm启动端口(默认9000)
2、 nginx配置php-fpm
3、php-fpm
内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象, 对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序, 比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升, 可能会因为占用内存过高而崩溃,或被系统杀掉
PHP属于高级语言,语言级别并没有内存的概念,在使用过程中完全不需要主动申请或释放内存, 所以在PHP用户代码级别也就不存在内存泄漏的概念了。
但毕竟PHP是使用C编写的解释器,而C语言的程序是可能出现内存泄漏问题,所以本质上还是一样的,那么可以这么说:如果你的PHP程序内存泄漏了,会有三种可能:
首先肯能是自己的代码有问题,比如没有及时释放大内存的变量等。
很多公司都会有自己的PHP扩展,而扩展通常也使用C/C++来编写,这样扩展本身也可能会因为内存不正确释放而导致内存泄漏。
有些扩展是对第三方库的一种包裹, 比如PHP的sqlite数据库操作接口主要是在libsqlite之上进行了封装,所以如果 libsqlite本身有内存泄漏的话,那也可能会带来问题。
根据官方的介绍,php-cgi不存在内存泄漏,每个请求完成后php-cgi会回收内存,但是不会释放给操作系统,这样就会导致大量内存被php-cgi占用。(这个对于内存不大的服务器,比如云主机就太致命了,利用命令:ps aux|grep php-cgi|grep -v grep|awk '{if($4>=1)print $2}'
可以查询占比1%的php-cgi的pid,然后kill掉(kill -9),这个方法比较好) 官方的解决办法是降低PHP_FCGI_MAX_REQUESTS
的值。
这里先简单说一下nginx+php-fpm模式的工作原理:
nginx服务器fork出n个子进程(worker),php-fpm管理器fork出n个子进程。
当有用户请求,nginx的一个worker接收请求,并将请求抛到socket中。
php-fpm空闲的子进程监听到socket中有请求,接收并处理请求。
这里要重点说一下第三步骤。第三步涉及到php-fpm进程生命周期的东西。一个php-fpm的生命周期大致是这样的:模块初始化(MINIT)-> 模块激活(RINIT)
没有安装EPEL的话,先执行,如果安装就跳过。
yum -y install epel-release
rpm 安装 Php7 相应的 yum源
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
卸载原有的php
yum remove php* php-common
直接yum安装php7
yum install php70w php70w-mysql php70w-mbstring php70w-mcrypt php70w-gd php70w-imap php70w-ldap php70w-odbc php70w-pear php70w-xml php70w-xmlrpc php70w-pdo
查看php安装了那些拓展模块
php -m
安装其他你需要的拓展模块
yum -y install php70w-xxx