标签 - PHP

PHP Imagick    2019-07-17 11:36:45    62    0    0
这篇文章主要介绍了PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF的相关资料,需要的朋友可以参考下
 

给骨头系统开发的图像库的 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
PHP    2019-07-17 10:23:33    23    0    0

查看phpinfo()信息 

  其实回过头看,安装过程中最容易出错的反而是下载阶段,一定要将imagemagick和imagick的版本和phpinfo的信息对应好!
下图中几点需要注意,每个人的信息可能不同,根据你自己的phpinfo来选择接下来的下载的程序及扩展版本:

  • PHP Version: PHP版本
  • compiler: MSVC11
  • Architecture: x86
  • Thread Safety: disabled 非线程安全,也就是NTS,相反的则是线程安全TS
     
    image.png

一. Imagemagick部分

1. 下载
  • 下载Imagemagick程序
    下载地址:Imagemagick程序下载地址
    打开链接,找到Imagemagick的下载区域,根据phpinfo我应该选择vc11,32位的下载链接,也就是下图中圈出的部分
     

    image.png
2. 安装
  • 解压缩 将下载后的压缩包,直接解压到你想放置的目录下,不要有中文和特殊字符,我把它放在了D:\install_dir\imagemagick下,并且记住不要忘记这个路径

  • 环境变量配置 为了更方便,全局都可以使用,我们需要配置下环境变量,进入刚才解压缩的目录,再进入/bin目录下,复制当前路径,我的路径为D:\install_dir\imagemagick\bin,右击我的电脑(计算机),按照下图依次打开环境变量配置位置,将路径粘贴进去(注意:Path中可能有多个路径,多个路径间用;分号分割就好)

     

    image.png

     

  • 导入DLL文件 进入imagemagickbin目录下,复制所有.dll后缀的文件到你的php根目录下(我使用的是Phpstudy建的环境,我的php路径为:D:\phpStudy\php\php-5.6.27-nts)我的版本有147个文件,这里有个小技巧,在文件管理器右上角搜索.dll,然后全选复制,会方便一点

     

    image.png

     

二. Imagick扩展部分

  首先imagick一个php扩展,可以使用php控制imagemagick程序

1. 下载
2. 安装
  • php_imagick.dll 找到刚下载的压缩包,解压后,找到p
PHP RSA    2019-05-14 11:25:28    31    0    0

        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

PHP    2019-04-25 16:46:25    23    0    0

Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数。Stream可以翻译为“流”,在Java里,流是一个很重要的概念。

流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。根据流的方向又可以分为输入流和输出流,同时可以在其外围再套上其它流,比如缓冲流,这样就可以得到更多流处理方法。

PHP里的流和Java里的流实际上是同一个概念,只是简单了一点。由于PHP主要用于Web开发,所以“流”这块的概念被提到的较少。如果有Java基础,对于PHP里的流就更容易理解了。其实PHP里的许多高级特性,比如SPL,异常,过滤器等都参考了Java的实现,在理念和原理上同出一辙。

比如下面是一段PHP SPL标准库的用法(遍历目录,查找固定条件的文件):

01class 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(newRecursiveDirectoryIterator($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 
PHP Protobuf    2019-04-25 10:01:59    17    0    0

下载代码

 git clone https://github.com/protocolbuffers/protobuf.git

安装protobuf:

./autogen.sh
./configure --prefix=/usr/local/protobuf
make
sudo make install

安装php扩展:

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    2019-03-29 10:18:04    29    0    0

当服务器安装了多个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

PHP    2019-03-26 10:15:48    24    0    0

内存泄漏

  内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象, 对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序, 比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升, 可能会因为占用内存过高而崩溃,或被系统杀掉

PHP的内存泄漏

  PHP属于高级语言,语言级别并没有内存的概念,在使用过程中完全不需要主动申请或释放内存, 所以在PHP用户代码级别也就不存在内存泄漏的概念了。
但毕竟PHP是使用C编写的解释器,而C语言的程序是可能出现内存泄漏问题,所以本质上还是一样的,那么可以这么说:如果你的PHP程序内存泄漏了,会有三种可能:
首先肯能是自己的代码有问题,比如没有及时释放大内存的变量等。
很多公司都会有自己的PHP扩展,而扩展通常也使用C/C++来编写,这样扩展本身也可能会因为内存不正确释放而导致内存泄漏。
有些扩展是对第三方库的一种包裹, 比如PHP的sqlite数据库操作接口主要是在libsqlite之上进行了封装,所以如果 libsqlite本身有内存泄漏的话,那也可能会带来问题。

PHP-CGI

  根据官方的介绍,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+php-fpm模式的工作原理:
nginx服务器fork出n个子进程(worker),php-fpm管理器fork出n个子进程。
当有用户请求,nginx的一个worker接收请求,并将请求抛到socket中。
php-fpm空闲的子进程监听到socket中有请求,接收并处理请求。

  这里要重点说一下第三步骤。第三步涉及到php-fpm进程生命周期的东西。一个php-fpm的生命周期大致是这样的:模块初始化(MINIT)-> 模块激活(RINIT)

Linux Centos PHP    2019-03-08 17:38:12    46    0    0

没有安装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

2/2