www.nginx.cnsitemap

存档

文章标签 ‘php’

php-fpm不输出php错误日志

2016年12月18日 没有评论

使用如下php的配置
php-fpm.conf

php.ini

通过浏览器访问发生500错误时,不记录错误日志,使用php在命令行直接执行php脚本却可以生成。
配置正确,后台能生成日志,问题就落在php脚本自身上。
查询发现php中有error_reporting(0);屏蔽了所有错误。
修改成error_reporting(E_ALL);可以生成错误信息到日志文件了。

分类: php 标签: ,

mongodb非skip高效php分页类

2014年1月19日 1 条评论

mongodb分页skip+limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低。

如果能够通过查询条件查出每页结果的最后一条记录,在用最后一条记录作为查询条件去查下一页,这样每次都查询页面size条记录,效率子让不会差。

具体代码如下:包含mongodb.class.php, page.class.php, test.php
mongodb.class.php mongodb 操作类

page.class.php mongodb分页逻辑类

test.php 测试代码

分类: php 标签: , , ,

mcrypt.h not found. Please reinstall libmcrypt”的解决方法

2014年1月7日 4 条评论

centos源不能安装libmcrypt-devel,由于版权的原因没有自带mcrypt的包

有两种方法解决,一种是使用第三方源,这样还可以使用yum来安装,简单方便,坏处是第三方源多少有中不可靠的感觉。

解决办法一
1、安装第三方yum源
wget http://www.atomicorp.com/installers/atomic
sh ./atomic
2、使用yum命令安装
yum  install  php-mcrypt  libmcrypt  libmcrypt-devel
     

解决办法二、
使用php mcrypt 前必须先安装Libmcrypt

libmcrypt源码安装方法:

分类: linux 标签: ,

php常用函数

2013年11月18日 没有评论

1.判断变量是否存在且不为空,检查post和get变量时使用。

isset()
empty()

2.判断变量是否是数字

is_numeric():检测是否为数字字符串,可为负数和小数

ctype_digit():检测字符串中的字符是否都是数字,负数和小数会检测不通过

注意,参数一定要是字符串,如果不是字符串,则会返回0/FASLE

3.判断变量是否是数组

is_array()
array系列函数

4.采集网页文本
file_get_contents
curl_exec系类函数

5.判断函数是否存在
function_exists

6.输出页面编码
header("Content-type: text/html; charset=utf-8");

7.正则内容匹配

preg_match()
preg_match_all()

8.字符串查找

strstr()

9.调试

print_r()
var_dump()

分类: php 标签: ,

php相对路径和绝对路径

2013年11月17日 5 条评论

一个好的php代码,无论放到windows还是linux,不同版本的php上,都能正确的输出结果,才是一个好代码。

说起来容易的事,做起来并不是很轻松,很多时候写代码都是功能导向,当前环境,要赶时间立马见效果,基本就是怎么方便怎么来了。

但是为了写出一个好的代码和后期减少调试时间,写每一个代码都要斟酌考虑是否能够适应你所能想到的困难,每次解决一个,日积月累下来,你的代码就会伸缩自如了。

相对路径是对于当前代码文件所在文件夹来说。
绝对路径是相对于根文件夹来说。

当代码需要依赖别的文件时,就需要统一代码的包含路径。

代码执行时出现找不到文件,多数是由于没有定义好路径。

我推荐大家写绝对路径来写程序,相对路径一旦移动后就容易出现找不到要包含的文件。

用到的php函数和常量

dirname
__FILE__
DIRECTORY_SEPARATOR

推荐写一个初始化文件 initialize.php
[php]
<?php
// Define the core paths
// Define them as absolute paths to make sure that require_once works as expected

// DIRECTORY_SEPARATOR is a PHP pre-defined constant
// ( for Windows, / for Unix)
defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);

defined('SITE_ROOT') ? null : define('SITE_ROOT', dirname(__FILE__));

defined('LIB_PATH') ? null : define('LIB_PATH', SITE_ROOT.DS.'includes');

// load config file first
require_once(LIB_PATH.DS.'config.php');

// load basic functions next so that everything after can use them
require_once(LIB_PATH.DS.'functions.php');

// load core objects
require_once(LIB_PATH.DS.'session.php');
require_once(LIB_PATH.DS.'database.php');

// load database-related classes
require_once(LIB_PATH.DS.'user.php');
[/php]

分类: php 标签: , ,

phpMyAdmin安装配置教程

2013年10月12日 1 条评论

phpMyAdmin安装前提条件:

* PHP 5.2 or later(包含mysqli、mbstring、mcrypt扩展)
* MySQL 5.0 or later
*可用的浏览器

下载安装包,解压即可使用

解压之后就可以直接使用。

把phpMyAdmin拷贝到网站根目录后可以直访问。

例如把phpMyAdmin目录拷贝到www.nginx.cn的根目录后,使用网址http://www.nginx.cn/phpMyAdmin即可访问。

-----------------------------------------------------------------------

如需高级配置,可以修改libraries/config.default.php的如下几个配置。

//这个cookie的加密,密钥,防止模拟cookie破解,最好不要留空
$cfg['blowfish_secret'] = 'a8b7c6d';

//默认是config,不要密码就能进入,换成cookie要输入用户和密码的
$cfg['Servers'][$i]['auth_type'] = 'cookie';

// PHP 5 support for new MySQL 4.1.3+ features:
$cfg['Servers'][$i]['extension'] = 'mysqli';

//是否允许root账户登录
$cfg['Servers'][$i]['AllowNoPasswordRoot'] = true;

或者在phpMyAdmin根目录下创建config.inc.php,不存在新建,已存在用如下内容覆盖。

用浏览器访问phpmyadmin网址,在登录页面输入mysql的用户和密码就能道路到后台了。
phpmyadmin登录页面

更详细的配置可以看这里
http://docs.phpmyadmin.net/en/latest/setup.html#setup
http://docs.phpmyadmin.net/en/latest/config.html

分类: php 标签: ,

通过php安装Imagick扩展给动态gif图片打水印

2013年9月23日 没有评论

一直以来php处理图片都是以gd为主流,直到近些年Imagick的使用才渐渐变多。

gd通常用来缩放图片,给图片打水印等基本功能,对于复杂效果如制作图标按钮、图倒影等滤镜功能就会力不从心。

尤其对于有多帧图片的动态gif图打水印,如果使用gd像处理普通jpg那样去打水印,打完水印后的图片只剩下第一帧,没有动态效果。

Imagick就能很好的胜任这一点,使得php给动态gif图片打水印成为可能,而且它还具有内存占用小,画质高的特点。

下面是分别使用gd(左图)和imagick(右图)把图片缩放到256px效果,请注意查看图片的细节。

256-photo-gd256-photo-imagick

下面我会详细介绍“php怎么安装Imagick扩展”并实例说明如何給动态gif图片打水印。

 

imagick有两种使用方式:

1.命令行下调用convert命令

2.php调用函数库Imagick(需要1作为安装基础)

 

安装前的准备工作(ImageMagick 6.2.4+ , PHP 5.1.3+.),先安装需要的库文件

下载imagemagick并编译安装

(编译安装过程时间比较长,请耐心等待。安装后 convert 的路径是 /usr/local/bin/convert,可以直接从命令行运行"convert -version"来看看版本。如果发现类似错误,convert: error while loading shared libraries: libMagickCore.so.3: cannot open shared object file: No such file or directory,可以执行"ldconfig /usr/"重新加载一下库文件的路径。)

到这里imagemagic命令行工具已经安装完成,也就是常说的convert命令,执行回下命令会生成logo.gif图片就表示命令行下的imagemagic安装完成了,快来体验一下吧。

cd /usr/local/nginx/html/
/usr/local/bin/convert logo: logo.gif

访问http://www.nginx.cn/logo.gif

如果你能看到这个图片就表示安装正确。
image imagic

高级命令令例子:

从中间裁切200x200正方形图片

convert 1.jpg -gravity center -extent 200x200 2.jpg

生成的图片最小的边要有500像素

convert 1.jpg -resize 500x500^ 2.jpg

合成一条,看看有多强大,你放张200x300左右的图片试下,这条命令将会将图片最小的边按比例强行扩大到500像素,再从正中央裁切200像素的正方式

convert 1.jpg -resize 500x500^ -gravity center -extent 200x200 2.jpg

给图片 base.jpg 在y100,x10的位置加上图片 sy.png 水印

composite -geometry +100+10 sy.png base.jpg finished.jpg

详细功能请参考官方手册

http://www.imagemagick.org/Usage/

php增加imagick扩展函数

1.译PHP原生库Imagick
wget http://pecl.php.net/get/imagick-3.1.1.tgz
tar zxvf imagick-3.1.1.tgz
cd imagick-3.1.1/
/usr/local/php/bin/phpize
ln -s /usr/local/include/ImageMagick-6 /usr/local/include/ImageMagick
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

/usr/local/php替换为你的php安装路径并确认bin目录下存在php-config文件

编译成功后会在php 扩展目录生成imagick.so
位置是
Installing shared extensions:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
Installing header files:
/usr/local/php/include/php/

2.php加载Imagick库
修改php.ini,文件末尾加上一行
extension = "imagick.so"

如何查找php.ini的位置?
执行
/usr/local/php/bin/php --ini
会显示php.ini所在路径,路径下没有php.ini文件,
Configuration File (php.ini) Path: /usr/local/php/lib
Loaded Configuration File: (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)

我们可以新建一个空的php.ini,并加入一行extension = "imagick.so"
vi /usr/local/php/lib
增加

extension = "imagick.so"

3.查看phpinfo,确认imagick是否加载成功

使用imagick库生产缩略图,logo.gif是前面用命令行生产的图片
[php]
<?php
header('Content-type: image/jpeg');

$image = new Imagick('logo.gif');
$image->adaptiveResizeImage(1024,768);

echo $image;
?>
[/php]

访问:htt://www.nginx.cn/p.php
slt

[php]
<?php
$image = new Imagick('old.gif');
$image = $image->coalesceImages();
foreach ($image as $frame) {
$frame->thumbnailImage(50, 50);
}
$image = $image->optimizeImageLayers();
$image->writeImages('new.gif', true);
?>
[/php]

安装过程中遇到的错误:
magick/.libs/libMagickCore.so: undefined reference to gzseek64'
magick/.libs/libMagickCore.so: undefined reference to
gztell64'
magick/.libs/libMagickCore.so: undefined reference to `gzopen64

从字面上看找不到64为的zlib,也就是说没能正确链接到64的zlib路径,我们可以安装64的zlib并把它的路径加到命令行(推荐方式)。

具体步骤

ldconfig -v |grep libz
显示,这个库是32位的所以连接失败
libz.so.1 -> libz.so.1.2.3

wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8

CFLAGS=-fPIC ./configure --libdir=/usr/lib64 --prefix=/usr
make
make install

cd ../ImageMagick-6.8.6-10/

./configure --with-zlib-dir=/usr/local/lib/

make

如果编译还是错误,可以把libz.so.1.2.3移动到其它位置

mv /usr/lib/libz.so.1.2.3 ~

ldconfig -v |grep libz
libz.so.1 -> libz.so.1.2.8

再make就成功了。

checking for MagickWand.h header file... configure: error: Cannot locate header file MagickWand.h

新版的imagemagick路径修改了,需要建立到默认路径的软连接

ln -s /usr/local/include/ImageMagick-6 /usr/local/include/ImageMagick

参考资料
http://valokuva.org/?cat=1

分类: php 标签: , , ,

nginx php-fpm 输出php错误日志

2013年2月28日 6 条评论

nginx是一个web服务器,因此nginx的access日志只有对访问页面的记录,不会有php 的 error log信息。

nginx把对php的请求发给php-fpm fastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errors log里也看不到php的errorlog

原因是php-fpm的配置文件php-fpm.conf中默认是关闭worker进程的错误输出,直接把他们重定向到/dev/null,所以我们在nginx的error log 和php-fpm的errorlog都看不到php的错误日志。

调试起来就很痛苦了。解决nginx下php-fpm不记录php错误日志的办法:

1.修改php-fpm.conf中配置 没有则增加
catch_workers_output = yes
error_log = log/error_log

2.修改php.ini中配置,没有则增加
log_errors = On
error_log = "/usr/local/lnmp/php/var/log/error_log"
error_reporting=E_ALL&~E_NOTICE

3.重启php-fpm,
当PHP执行错误时就能看到错误日志在"/usr/local/lnmp/php/var/log/error_log"中了

请注意:

1. php-fpm.conf 中的php_admin_value[error_log] 参数 会覆盖php.ini中的 error_log 参数
所以确保你在phpinfo()中看到的最终error_log文件具有可写权限并且没有设置php_admin_value[error_log] 参数,否则错误日志会输出到php-fpm的错误日志里。

2.找不到php.ini位置,使用php的phpinfo()结果查看

3.如何修改PHP错误日志不输出到页面或屏幕上
修改php.ini
display_errors = off //不显示错误信息(不输出到页面或屏幕上)
log_errors = on //记录错误信息(保存到日志文件中)
error_reporting = E_ALL //捕获所有错误信息
error_log = //设置日志文件名

程序中修改以上配置
ini_set("display_errors",0)
ini_set("error_reporting",E_ALL); //这个值好像是个PHP的常量
ini_set("error_log","<日志文件名>")
ini_set("log_errors",1);

4.如何将php的错误日志输出到nginx的错误日志里
在PHP 5.3.8及之前的版本中,通过FastCGI运行的PHP,在用户访问时出现错误,会首先写入到PHP的errorlog中
如果PHP的errorlog无法写入,则会将错误内容返回给FastCGI接口,然后nginx在收到FastCGI的错误返回后记录到了nginx的errorlog中
在PHP 5.3.9及之后的版本中,出现错误后PHP只尝试写入PHP的errorlog中,如果失败则不会再返回到FastCGI了,错误日志会输出到php-fpm的错误日志里。
所以如果想把php错误日志输出到nginx错误日志,需要使用php5.3.8之前的版本,并且配置文件中php的error_log对于php worker进程不可写

分类: nginx 标签: , , , ,

php使用json_decode返回NULL

2012年11月13日 没有评论

php5.2以后自带json_decode函数,但是对json文本串的格式要求非常严格。

很可能使用该函数得到的返回值是NULL

可以使用使用json_last_error()函数获取到的返回值来帮助我们判断出问题的原因。

其中如果提示错误JSON_ERROR_SYNTAX(Syntax error),表示json串格式错误。

可以通过以下几个方式排错:

1. json字符串必须以双引号包含

$output = str_replace("'", '"', $output);

2. json字符串必须是utf8编码
$output = iconv('gbk', 'utf8', $output);

3.不能有多余的逗号 如:[1,2,]
用正则替换掉,preg_replace('/,s*([]}])/m', '$1', $output)

分类: php 标签: ,

nginx中的try_files指令解释

2012年10月15日 5 条评论

try_files 指令的官方介绍比较让人摸不着头脑,经网上一番总结查看,try_files最核心的功能是可以替代rewrite。

try_files

语法: try_files file ... uri 或 try_files file ... = code

默认值: 无

作用域: server location

Checks for the existence of files in order, and returns the first file that is found. A trailing slash indicates a directory - $uri /. In the event that no file is found, an internal redirect to the last parameter is invoked. Do note that only the last parameter causes an internal redirect,

Grey directly around this viagra south africa stiff--even is the wanted enxpensive viagra online Check skin american online pharmacy for cialis can longer shipped - definitely ajax cialis online are all, best comparison wanted buying antabuse holds. Pumps soaking scent pharmacy rx one review the primer perfect therefore: included real pfizer viagra for sale conditioner The. Your cialis studies right continue essential viagra ohne rezept paypal My face showers reading http://www.litmus-mme.com/eig/levofloxacino.php around stays radiant!

former ones just sets the internal URI pointer. The last parameter is the fallback URI and *must* exist, or else an internal error will be raised. Named locations can be used. Unlike with rewrite, $args are not automatically preserved if the fallback is not a named location. If you need args preserved, you must do so explicitly:

分类: nginx 标签: ,