[实践OK]Web服务器(如Apache、Nginx)会默认开启对断点续传的支持,php支持断点续传的文件下载类,PHP上传实现断点续传文件的方法。
Php/Js/Shell/Go jackxiang 2014-11-19 17:05
背景:大文件的断点续传,有时网络波动啥的,需要断点从已经下载位置续传下载文件,对于没有传过的文件再次从开始下载就麻烦了,这块http协议支持的,Apache和Nginx都支持这样的方法实现了从某个部分进行断点下载。
服务器是否支持断点续传的判断:
更多 0
断点续传 linux wget 服务器 curl
通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处。断点续传是在发起HTTP请求的时候加入RANGE头来告诉服务器客户端已经下载了多少字节。等所有这些请求都返回之后,再把得到的内容一块一块的拼接起来得到完整的资源。
Resumable download file Web服务器(如Apache)默认开启断点续传
你可以通过以下的命令来测试一下。
Linux 测试服务器是否支持断点续传
localhost [~]# wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | grep ‘Accept-Ranges’
Accept-Ranges: bytes
输出结果 Accept-Ranges: bytes ,说明服务器支持按字节下载。
curl 命令发送字节范围下载
curl –range 0-99 http://images.apple.com/home/images/billboard_iphone_hero.jpg
这样可以到最开始99字节,结果如下图:
curl range bytes request curl 命令发送字节范围请求
说明从服务器端按字节范围下载是完全没有问题的。
现在我们尝试以下方式:
1、一次性下载整个图片。
localhost [~]# curl –range 0-98315 http://images.apple.com/home/images/billboard_iphone_hero.jpg > test.jpg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 98316 100 98316 0 0 524k 0 –:–:– –:–:– –:—:— 527k
完成后,test.jpg完全等于billboard_iphone_hero.jpg,文件大小为98,316 字节。
实践如下:我的Nginx服务器,请求下看是否支持,如下:
1)实践下下载这块的header返回头有Accept-Ranges: bytes证明Nginx也是支持断点续传下载的:
(1)Curl包含range的请求头是这样的:
(2)其抓包Nginx的返回头是这样:
HTTP/1.1 206 Partial Content
Server: nginx
Date: Wed, 19 Nov 2014 14:45:07 GMT
Content-Type: image/jpeg
Content-Length: 109
Last-Modified: Fri, 07 Nov 2014 05:06:12 GMT
Connection: keep-alive
ETag: "545c5344-1b8c"
Expires: Fri, 19 Dec 2014 14:45:07 GMT
Cache-Control: max-age=2592000
Content-Range: bytes 0-108/7052
4)通过前面的curl及wget联合起来,先后组合起来实现一个断点下载整个图片,并看其服务器返回头(curl已经下了前面的108,后从109开始wget:
(1)先保存一部分到108:
(2)再通过wget的断点续传下载命令-c,请求剩下的部分(Content-Range: bytes 109-7051/7052):
A)加上-S看返回头, -S, --server-response 打印服务器响应。:
B)发起头如下,也就是说经curl保存一部分后,wget通过-c参数时,后面它会去读取目前文件大小,后写在http头里去找服务端要,请求头如下:
注意:字节是从0开始,结束字节为总字节长度 减 1。
来自:http://ju.outofmemory.cn/entry/23646
Nginx:http://chenzhenianqing.cn/articles/926.html
阅读全文
服务器是否支持断点续传的判断:
更多 0
断点续传 linux wget 服务器 curl
通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处。断点续传是在发起HTTP请求的时候加入RANGE头来告诉服务器客户端已经下载了多少字节。等所有这些请求都返回之后,再把得到的内容一块一块的拼接起来得到完整的资源。
Resumable download file Web服务器(如Apache)默认开启断点续传
你可以通过以下的命令来测试一下。
Linux 测试服务器是否支持断点续传
localhost [~]# wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | grep ‘Accept-Ranges’
Accept-Ranges: bytes
输出结果 Accept-Ranges: bytes ,说明服务器支持按字节下载。
curl 命令发送字节范围下载
curl –range 0-99 http://images.apple.com/home/images/billboard_iphone_hero.jpg
这样可以到最开始99字节,结果如下图:
curl range bytes request curl 命令发送字节范围请求
说明从服务器端按字节范围下载是完全没有问题的。
现在我们尝试以下方式:
1、一次性下载整个图片。
localhost [~]# curl –range 0-98315 http://images.apple.com/home/images/billboard_iphone_hero.jpg > test.jpg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 98316 100 98316 0 0 524k 0 –:–:– –:–:– –:—:— 527k
完成后,test.jpg完全等于billboard_iphone_hero.jpg,文件大小为98,316 字节。
实践如下:我的Nginx服务器,请求下看是否支持,如下:
1)实践下下载这块的header返回头有Accept-Ranges: bytes证明Nginx也是支持断点续传下载的:
(1)Curl包含range的请求头是这样的:
(2)其抓包Nginx的返回头是这样:
HTTP/1.1 206 Partial Content
Server: nginx
Date: Wed, 19 Nov 2014 14:45:07 GMT
Content-Type: image/jpeg
Content-Length: 109
Last-Modified: Fri, 07 Nov 2014 05:06:12 GMT
Connection: keep-alive
ETag: "545c5344-1b8c"
Expires: Fri, 19 Dec 2014 14:45:07 GMT
Cache-Control: max-age=2592000
Content-Range: bytes 0-108/7052
4)通过前面的curl及wget联合起来,先后组合起来实现一个断点下载整个图片,并看其服务器返回头(curl已经下了前面的108,后从109开始wget:
(1)先保存一部分到108:
(2)再通过wget的断点续传下载命令-c,请求剩下的部分(Content-Range: bytes 109-7051/7052):
A)加上-S看返回头, -S, --server-response 打印服务器响应。:
B)发起头如下,也就是说经curl保存一部分后,wget通过-c参数时,后面它会去读取目前文件大小,后写在http头里去找服务端要,请求头如下:
注意:字节是从0开始,结束字节为总字节长度 减 1。
来自:http://ju.outofmemory.cn/entry/23646
Nginx:http://chenzhenianqing.cn/articles/926.html
阅读全文
PHP中Notice: iconv(): Unknown error (84) 的解决办法
Php/Js/Shell/Go jackxiang 2014-10-23 21:20
今天用PHP读取一个接口的数据使用了iconv转换字符编码格式,出现Notice: iconv(): Unknown error (84) :
上面这行摘自:http://jackxiang.com/post/1057/
最后,修改为如下:
———————————————————————————————————————————————————
读其官方文档 http://www.php.net/manual/en/function.iconv.php对参数out_charset的解释:
The output charset.
If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can’t be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character and an E_NOTICE is generated.
大概的意思就是:
如果你加上 //TRANSLIT 到out_charset 的参数后面,意味着如果找不到目标编码,则程序会去找与其相近的编码。如果你加的是//IGNORE,则不会去找相近的编码,而且只要有一个字符是程序无法识别的则将会报错。
根据上面的解释我将代码
iconv('gb2312','utf-8', serialize($storeData));
改为
iconv('gb2312','utf-8//TRANSLIT//IGNORE', serialize($storeData));
这样就ok了!
来自:http://www.tonitech.com/822.html
上面这行摘自:http://jackxiang.com/post/1057/
最后,修改为如下:
———————————————————————————————————————————————————
读其官方文档 http://www.php.net/manual/en/function.iconv.php对参数out_charset的解释:
The output charset.
If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can’t be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character and an E_NOTICE is generated.
大概的意思就是:
如果你加上 //TRANSLIT 到out_charset 的参数后面,意味着如果找不到目标编码,则程序会去找与其相近的编码。如果你加的是//IGNORE,则不会去找相近的编码,而且只要有一个字符是程序无法识别的则将会报错。
根据上面的解释我将代码
iconv('gb2312','utf-8', serialize($storeData));
改为
iconv('gb2312','utf-8//TRANSLIT//IGNORE', serialize($storeData));
这样就ok了!
来自:http://www.tonitech.com/822.html
VI E513: 写入错误,转换失败 (请将 'fenc' 置空以强制执行)
Php/Js/Shell/Go jackxiang 2014-10-22 20:26
E513: 写入错误,转换失败 (请将 'fenc' 置空以强制执行) 警告: 原始文件可能已丢失或损坏 在文件正确写入前请勿退出编辑器!
set fenc=
来自:
http://forum.ubuntu.org.cn/viewtopic.php?p=2498184
set fenc=
来自:
http://forum.ubuntu.org.cn/viewtopic.php?p=2498184
背景:在用c获取root后,执行一个命令退出时,报exit logout TERM environment variable not set.
# to avoid the error: TERM environment variable not set.
#
TERM=linux
export TERM
clear
摘自:http://bbs.chinaunix.net/thread-2070668-1-1.html
# to avoid the error: TERM environment variable not set.
#
TERM=linux
export TERM
clear
摘自:http://bbs.chinaunix.net/thread-2070668-1-1.html
phpdbg 作为一个交互式集成的调试器SAPI,安装扩展到PHP5.6.0里。
Php/Js/Shell/Go jackxiang 2014-10-4 10:01
背景:以前调试PHP如CPU100%发生在哪儿,用GDB,现在PHP自己带了一个PHPGDB,方便调试。
root@119.10.6.23:/data/codesdev/phpServer# php test.php
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0# ps aux|grep test.php
root 4071 1.3 1.5 350356 92040 pts/1 S+ 11:37 0:00 php test.php
cli方式执行php脚本,加入执行的进程号为4071。我们使用gdb命令来调试进程。
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0# gdb -p 4071
(gdb) print (char *)executor_globals.active_op_array->filename
$1 = 0x2ad61b4c8c48 "/data/codesdev/phpServer/test.php"
(gdb) print (char *)executor_globals.active_op_array->function_name
$2 = 0x2ad61b4c8d50 "test1"
(gdb) print executor_globals->current_execute_data->opline->lineno
$3 = 4
(gdb) print executor_globals->current_execute_data->opline->lineno
$4 = 4
很显然,他正在执行第四行的sleep方法。
如果上面的方法你感觉麻烦,那你可以使用.gdbinit文件。这个文件在php源码的根目录下。使用方法如下:
题外话:
从php5.6开始,php中集成了一个phpdbg的工具。可以像gdb调试c语言程序一样,调试php程序。感兴趣的话,可以打开下面的连接看看。
https://wiki.php.net/rfc/phpdbg
http://phpdbg.com/docs
来自:http://www.searchtb.com/2014/04/当cpu飙升时,找出php中可能有问题的代码行.html
————————————————————————————————————————————————————————————
phpdbg 作为一个交互式集成的调试器SAPI:
http://phpdbg.com/
Download:
https://codeload.github.com/krakjoe/phpdbg/legacy.zip/v0.4.0
Unzip:
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0/ext/krakjoe-phpdbg-cee9645#
http://phpdbg.com/docs
Installation
To install phpdbg, you must compile the source against your PHP installation sources, and enable the SAPI with the configure command.
cd /usr/src/php-src/sapi
git clone https://github.com/krakjoe/phpdbg
cd ../
./buildconf --force
./config.nice
make -j8
make install-phpdbg
phpdbg Felipe Pena, Joe Watkins, Bob Weinand
Command Line Options
The following switches are implemented (just like cli SAPI):
-n ignore php ini
-c search for php ini in path
-z load zend extension
-d define php ini entry
The following switches change the default behaviour of phpdbg:
-v disables quietness
-s enabled stepping
-e sets execution context
-b boring - disables use of colour on the console
-I ignore .phpdbginit (default init file)
-i override .phpgdbinit location (implies -I)
-O set oplog output file
-q do not print banner on startup
-r jump straight to run
-E enable step through eval()
Note: passing -rr will cause phpdbg to quit after execution, rather than returning to the console
root@119.10.6.23:/data/codesdev/phpServer# php test.php
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0# ps aux|grep test.php
root 4071 1.3 1.5 350356 92040 pts/1 S+ 11:37 0:00 php test.php
cli方式执行php脚本,加入执行的进程号为4071。我们使用gdb命令来调试进程。
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0# gdb -p 4071
(gdb) print (char *)executor_globals.active_op_array->filename
$1 = 0x2ad61b4c8c48 "/data/codesdev/phpServer/test.php"
(gdb) print (char *)executor_globals.active_op_array->function_name
$2 = 0x2ad61b4c8d50 "test1"
(gdb) print executor_globals->current_execute_data->opline->lineno
$3 = 4
(gdb) print executor_globals->current_execute_data->opline->lineno
$4 = 4
很显然,他正在执行第四行的sleep方法。
如果上面的方法你感觉麻烦,那你可以使用.gdbinit文件。这个文件在php源码的根目录下。使用方法如下:
题外话:
从php5.6开始,php中集成了一个phpdbg的工具。可以像gdb调试c语言程序一样,调试php程序。感兴趣的话,可以打开下面的连接看看。
https://wiki.php.net/rfc/phpdbg
http://phpdbg.com/docs
来自:http://www.searchtb.com/2014/04/当cpu飙升时,找出php中可能有问题的代码行.html
————————————————————————————————————————————————————————————
phpdbg 作为一个交互式集成的调试器SAPI:
http://phpdbg.com/
Download:
https://codeload.github.com/krakjoe/phpdbg/legacy.zip/v0.4.0
Unzip:
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0/ext/krakjoe-phpdbg-cee9645#
http://phpdbg.com/docs
Installation
To install phpdbg, you must compile the source against your PHP installation sources, and enable the SAPI with the configure command.
cd /usr/src/php-src/sapi
git clone https://github.com/krakjoe/phpdbg
cd ../
./buildconf --force
./config.nice
make -j8
make install-phpdbg
phpdbg Felipe Pena, Joe Watkins, Bob Weinand
Command Line Options
The following switches are implemented (just like cli SAPI):
-n ignore php ini
-c search for php ini in path
-z load zend extension
-d define php ini entry
The following switches change the default behaviour of phpdbg:
-v disables quietness
-s enabled stepping
-e sets execution context
-b boring - disables use of colour on the console
-I ignore .phpdbginit (default init file)
-i override .phpgdbinit location (implies -I)
-O set oplog output file
-q do not print banner on startup
-r jump straight to run
-E enable step through eval()
Note: passing -rr will cause phpdbg to quit after execution, rather than returning to the console
php-fpm 配置不当 导致 nginx 502 错误一例
Php/Js/Shell/Go jackxiang 2014-10-1 00:07
背景:开php-fpm的9000端口,有时配置出错会出现502,特别转载。
不要总看nginx 的日志文件。
对于开端口这种事情,listen.allowed_clients 里逗号分割不能有空格!
[www]
listen = 10.11.80.49:9000
listen.allowed_clients = 10.11.80.47,10.11.80.48, 10.11.80.49
阅读全文
不要总看nginx 的日志文件。
对于开端口这种事情,listen.allowed_clients 里逗号分割不能有空格!
[www]
listen = 10.11.80.49:9000
listen.allowed_clients = 10.11.80.47,10.11.80.48, 10.11.80.49
阅读全文
背景:有可能 fastcgi Connection reset by peer于502共同发生,(参看:https://jackxiang.com/post/4710/ ,http://www.jb51.net/article/50408.htm 写道:很多站长转到nginx+php-fpm后,饱受500,502问题困扰。当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。php-fpm.conf的配置文件中有一个参数request_slowlog_timeout。 )。注意nginx的notice日志及php的request_slowlog_timeout日志。
1)nginx:
在nginx的全局配置中增加 : error_log logs/error.log notice;
nginx记录日志信息分两个级别,第一个级别的取值为如下之一:
“stderr”, “emerg”, “alert”, “crit”, “error”,”warn”, “notice”, “info”, “debug”
这些值是互斥的,也就是说只能取其中之一,如果在配置文件里加了像如下这种两条配置项:
error_log logs/error.log notice;
error_log logs/error.log info;
2)php的php-fpm.conf增加时间长度限定超过就算超时:
当PHP运行在php-fpm模式下,php.ini配置的max_execute_time是无效的,需要在php-fpm.conf中配置另外一个配置项:request_terminate_timeout;
request_terminate_timeout = 10
request_slowlog_timeout = 0
slowlog = /data/logs/php/slow.log
当request_slowlog_timeout 设为一个具体秒时request_slowlog_timeout =5,表示如果哪个脚本执行时间大于5秒,会记录这个脚本到慢日志文件中
request_slowlog_timeout =0表示关闭慢日志输出。
摘自:http://blog.csdn.net/zhangxinrun/article/details/17002939
下面是php 5.3以上版本将TCP改成socket方式的配置方法:
修改php-fpm.conf(/usr/local/php/etc/php-fpm.conf)
;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock
nginx通过unix socket和fastcgi通信,比tcp socket要高效,重负荷下可以考虑。
1、在nginx.conf中修改配置为:
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
2、在php-fpm.conf中修改配置为:
/tmp/php-cgi.sock
同理,在proxy_pass、upstream server 等处都能使用
言归正传:
Connection reset by peer
这个错误是在nginx的错误日志中发现的,为了更全面的掌握nginx运行的异常,强烈建议在nginx的全局配置中增加
error_log logs/error.log notice;
这样,就可以记录nginx的详细异常信息。
nginx的错误日志中会出现Connection reset by peer) while reading response header from upstream, client: 1.1.1.1, server: 102.local, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000
后来反复检查,发现这是因为php运行较慢,并超出php-fpm.conf的request_terminate_timeout设置的秒数。
request_terminate_timeout用于设置当某个php脚本运行最长时间,若超出php-fpm进程管理器强行中止当前程序,并关闭fastcgi和nginx的网络连接,然后nginx中就会出现Connection reset by peer的错误了。
也就是说,产生这个错误的原因是:
php 程序的运行时间超出request_terminate_timeout设置的值。
在php-fpm环境下,在php的安装目录的etc/php-fpm.conf中有此值的设置项,可将其设置为0或更大的值。
提示,在php.ini中存在一项max_execution_time,也用于设置php脚本的最长执行时间。但在php-fpm环境下,我发现max_execution_time的设置是无效的,只有request_terminate_timeout产生了作用。
总结:请将request_terminate_timeout设置为较大的值或0,可减少因php脚本执行时行过长导致nginx产生Connection reset by peer错误。
转自:http://zhangxugg-163-com.iteye.com/blog/1310311
1)nginx:
在nginx的全局配置中增加 : error_log logs/error.log notice;
nginx记录日志信息分两个级别,第一个级别的取值为如下之一:
“stderr”, “emerg”, “alert”, “crit”, “error”,”warn”, “notice”, “info”, “debug”
这些值是互斥的,也就是说只能取其中之一,如果在配置文件里加了像如下这种两条配置项:
error_log logs/error.log notice;
error_log logs/error.log info;
2)php的php-fpm.conf增加时间长度限定超过就算超时:
当PHP运行在php-fpm模式下,php.ini配置的max_execute_time是无效的,需要在php-fpm.conf中配置另外一个配置项:request_terminate_timeout;
request_terminate_timeout = 10
request_slowlog_timeout = 0
slowlog = /data/logs/php/slow.log
当request_slowlog_timeout 设为一个具体秒时request_slowlog_timeout =5,表示如果哪个脚本执行时间大于5秒,会记录这个脚本到慢日志文件中
request_slowlog_timeout =0表示关闭慢日志输出。
摘自:http://blog.csdn.net/zhangxinrun/article/details/17002939
下面是php 5.3以上版本将TCP改成socket方式的配置方法:
修改php-fpm.conf(/usr/local/php/etc/php-fpm.conf)
;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock
nginx通过unix socket和fastcgi通信,比tcp socket要高效,重负荷下可以考虑。
1、在nginx.conf中修改配置为:
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
2、在php-fpm.conf中修改配置为:
/tmp/php-cgi.sock
同理,在proxy_pass、upstream server 等处都能使用
言归正传:
Connection reset by peer
这个错误是在nginx的错误日志中发现的,为了更全面的掌握nginx运行的异常,强烈建议在nginx的全局配置中增加
error_log logs/error.log notice;
这样,就可以记录nginx的详细异常信息。
nginx的错误日志中会出现Connection reset by peer) while reading response header from upstream, client: 1.1.1.1, server: 102.local, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000
后来反复检查,发现这是因为php运行较慢,并超出php-fpm.conf的request_terminate_timeout设置的秒数。
request_terminate_timeout用于设置当某个php脚本运行最长时间,若超出php-fpm进程管理器强行中止当前程序,并关闭fastcgi和nginx的网络连接,然后nginx中就会出现Connection reset by peer的错误了。
也就是说,产生这个错误的原因是:
php 程序的运行时间超出request_terminate_timeout设置的值。
在php-fpm环境下,在php的安装目录的etc/php-fpm.conf中有此值的设置项,可将其设置为0或更大的值。
提示,在php.ini中存在一项max_execution_time,也用于设置php脚本的最长执行时间。但在php-fpm环境下,我发现max_execution_time的设置是无效的,只有request_terminate_timeout产生了作用。
总结:请将request_terminate_timeout设置为较大的值或0,可减少因php脚本执行时行过长导致nginx产生Connection reset by peer错误。
转自:http://zhangxugg-163-com.iteye.com/blog/1310311
升级mysql到5.6.21 Php升级为5.6.0后bo-blog出现乱码的问题解决。
Php/Js/Shell/Go jackxiang 2014-9-29 17:43
背景:最近升级mysql到: 5.6.21,PHP也升级到php-5.6.0,发现博客成乱码了。
解决办法:
my.cnf
备注:
Php升级为5.6.0后注意OPCache生成扩展路径和PHP5.5.32位置不一样,否则会报:
The Zend Engine API version 220131226 which is installed, is newer.
解决办法:
my.cnf
备注:
Php升级为5.6.0后注意OPCache生成扩展路径和PHP5.5.32位置不一样,否则会报:
The Zend Engine API version 220131226 which is installed, is newer.
使用Phar来打包发布PHP程序
Php/Js/Shell/Go jackxiang 2014-9-29 14:21
背景:PHP学Java的jar文件一样可以打包,有点意思。
——
简单来说,Phar就是把Java界的jar概念移植到了PHP界。
Phar可以将一组PHP文件进行打包,还可以创建默认执行的stub(或者叫做 bootstrap loader),Phar可以选择是否进行压缩,可选gzip和bzip2格式。
下面举例说明如何创建和使用Phar:
假设我们的项目名称是user,包含三个文件:
user/user.class.php
user/user.func.php
user/test.php
然后我们使用如下PHP程序创建Phar文件:
make_phar.php
执行 php make_phar.php后,可以在当前目录发现一个叫做user.phar的文件。
我们可以直接执行user.phar文件:
php user.phar,这个相当于执行user/test.php
我们还可以引用此文件:
test_phar.php
摘自:
http://xmgu2008.blog.163.com/blog/static/1391223802014225101912694/
参考资料:
https://php.net/manual/en/book.phar.php
——
简单来说,Phar就是把Java界的jar概念移植到了PHP界。
Phar可以将一组PHP文件进行打包,还可以创建默认执行的stub(或者叫做 bootstrap loader),Phar可以选择是否进行压缩,可选gzip和bzip2格式。
下面举例说明如何创建和使用Phar:
假设我们的项目名称是user,包含三个文件:
user/user.class.php
user/user.func.php
user/test.php
然后我们使用如下PHP程序创建Phar文件:
make_phar.php
执行 php make_phar.php后,可以在当前目录发现一个叫做user.phar的文件。
我们可以直接执行user.phar文件:
php user.phar,这个相当于执行user/test.php
我们还可以引用此文件:
test_phar.php
摘自:
http://xmgu2008.blog.163.com/blog/static/1391223802014225101912694/
参考资料:
https://php.net/manual/en/book.phar.php
背景:php-fpm一般来说是够用,难免不够用,一是怎么样看,二是怎么样判断是否真够用,博主用了一个命令:netstat -anpo | grep "php-cgi" | wc -l 去和自己配置php-fpm.conf作对比,再者是对nginx出现各种错误都出现502揽在自己身上了,于其说nginx是为了安全,还不如说是也给排查问题增加了难度,再就是超时等,nginx有nginx的超时,php有php配置的超时,双方都是一个相互关联的问题,这些都是对于lnmp架构里经常遇到的问题。
统计Nginx日志里有502的行数有一个大体的了解,如下:
cat a.txt
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 502
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
cat a.txt |awk '{print "line:"NR " status:"$9}'|grep 502
line:3 status:502
——————————————————————————————————————————————
Nginx 502的触发条件
502错误最通常的出现情况就是后端主机当机。在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了 nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。我一般是全写上的:
proxy_next_upstream error timeout invalid_header http_500 http_503; 不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆 stacktrace的错误信息,现在被502取代了。但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理 了……
阅读全文
统计Nginx日志里有502的行数有一个大体的了解,如下:
cat a.txt
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 502
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
183.60.235.59 - - [31/Jan/2015:00:00:06 +0800] "GET /forum/0/index.html HTTP/1.1" 302
cat a.txt |awk '{print "line:"NR " status:"$9}'|grep 502
line:3 status:502
——————————————————————————————————————————————
Nginx 502的触发条件
502错误最通常的出现情况就是后端主机当机。在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了 nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。我一般是全写上的:
proxy_next_upstream error timeout invalid_header http_500 http_503; 不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆 stacktrace的错误信息,现在被502取代了。但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理 了……
阅读全文
背景:当用popen打开多个command时会出现重用变量,二是会用连字符进行连接command返回的变量,两次popen会有两个地方出现问题。
$handle = popen($command, "r");
do {
$excuteResult = fread($handle, 2024);
if (strlen($excuteResult) == 0) {
pclose($handle); //关闭pipe
break;
}
$excuteResultAll .= $excuteResult;
} while (true);
//这儿用到的$excuteResultAll 变量,下面还要用,防止污染,则需要给NULL值清空,用unset后需要再定义一次相同的变量,否则会出现:
Undefined variable: excuteResultAll in /data/htdocs/jackxiang.com/index.php on line 354
do {
$excuteResult = fread($handle, 2024);
if (strlen($excuteResult) == 0) {
pclose($handle); //关闭pipe
break;
}
$excuteResultAll .= $excuteResult;
} while (true);
______________________________小demon实践如下:______________________________
php null.php
<?php
$foo = "";
$foo = "jack";
unset($foo);
$foo .= "xiang";
$vars = get_defined_vars();
通过unset后,$foo变量用点连接时运行如下:
[22-Sep-2014 14:29:59 Asia/Shanghai] PHP Notice: Undefined variable: foo in /tmp/null.php on line 6
[foo] => xiang
而不用unset而用NULL后:
<?php
$foo = "";
$foo = "jack";
$foo = NULL;
//unset($foo);
$foo .= "xiang";
$vars = get_defined_vars();
print_r($vars);
解决了这个变量的问题:
[foo] => xiang
说明这样做是可行的,完毕。
$handle = popen($command, "r");
do {
$excuteResult = fread($handle, 2024);
if (strlen($excuteResult) == 0) {
pclose($handle); //关闭pipe
break;
}
$excuteResultAll .= $excuteResult;
} while (true);
//这儿用到的$excuteResultAll 变量,下面还要用,防止污染,则需要给NULL值清空,用unset后需要再定义一次相同的变量,否则会出现:
Undefined variable: excuteResultAll in /data/htdocs/jackxiang.com/index.php on line 354
do {
$excuteResult = fread($handle, 2024);
if (strlen($excuteResult) == 0) {
pclose($handle); //关闭pipe
break;
}
$excuteResultAll .= $excuteResult;
} while (true);
______________________________小demon实践如下:______________________________
php null.php
<?php
$foo = "";
$foo = "jack";
unset($foo);
$foo .= "xiang";
$vars = get_defined_vars();
通过unset后,$foo变量用点连接时运行如下:
[22-Sep-2014 14:29:59 Asia/Shanghai] PHP Notice: Undefined variable: foo in /tmp/null.php on line 6
[foo] => xiang
而不用unset而用NULL后:
<?php
$foo = "";
$foo = "jack";
$foo = NULL;
//unset($foo);
$foo .= "xiang";
$vars = get_defined_vars();
print_r($vars);
解决了这个变量的问题:
[foo] => xiang
说明这样做是可行的,完毕。
iframe跨域传值超过2M的问题解决
Php/Js/Shell/Go jackxiang 2014-9-11 18:20
iframe跨域传值超过2M的问题解决
使用iframe进行传值时,如果采用URL的方式传递,则最大只能传递大约2k的数据,超过这个长度就会被截断了,那么是否可以采用post的方式传值呢?答案是可以的,我们可以采用js创建一个form表单,并将此form提交到iframe上,这样就能做到打破2k数据的限制。
还需要注意2个问题:
1 tomcat下post不能超过2M的问题
这个需要将tomcat的配置文件server.xml修改一下:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" maxPostSize="0"/>
maxPostSize为0时,表示不用限制长度。
2 跨域的问题
跨域不影响iframe的post传值,发送方的tomcat无需更改,只是需要将接收方的tomcat的maxPostSize修改为0即可。
来自:http://housen1987.iteye.com/blog/1695065
使用iframe进行传值时,如果采用URL的方式传递,则最大只能传递大约2k的数据,超过这个长度就会被截断了,那么是否可以采用post的方式传值呢?答案是可以的,我们可以采用js创建一个form表单,并将此form提交到iframe上,这样就能做到打破2k数据的限制。
还需要注意2个问题:
1 tomcat下post不能超过2M的问题
这个需要将tomcat的配置文件server.xml修改一下:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" maxPostSize="0"/>
maxPostSize为0时,表示不用限制长度。
2 跨域的问题
跨域不影响iframe的post传值,发送方的tomcat无需更改,只是需要将接收方的tomcat的maxPostSize修改为0即可。
来自:http://housen1987.iteye.com/blog/1695065
Warning: Call-time pass-by-reference has been deprecated解决方法
Php/Js/Shell/Go jackxiang 2014-8-26 16:12
/*
Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of getimagesize(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. ind:\vhost\include\inc_custom_fields.php on line178
*/
我把php.ini的display_errors = on改成display_errors = off // (不显示错误)
就不显示了。
虽然没有什么影响。但是心里还是有个疙瘩。。。
百度上没有找到什么答案,然后在google上 找到了。
修改php.ini就可以了。
1. 在PHP.ini中搜索关键字 : allow_call_time_pass_reference 没有的自行建立。
2. 将 Off 改成 On ,Web Server重起就OK了~
allow_call_time_pass_reference = Off 变成 allow_call_time_pass_reference = On
ps
文档注解为:
是否启用在函数调用时强制参数被按照引用传递。此方法已不被赞成并在 PHP/Zend 未来的版本中很可能不再支持。鼓励使用的方法是在函数定义中指定哪些参数应该用引用传递。鼓励大家尝试关闭此选项并确保脚本能够正常运行,以确保该脚本也能在未来的版本中运行(每次使用此特性都会收到一条警告,参数会被按值传递而不是按照引用传递)。
在函数调用时通过引用传递参数是不推荐的,因为它影响到了代码的整洁。如果函数的参数没有声明作为引用传递,函数可以通过未写入文档的方法修改其参数。要避免其副作用,最好仅在函数声明时指定那个参数需要通过引用传递。
可以在函数里修改外面变量的值:
这样写就有前面描述的一系列问题:
说白了就是不能传一个地址给一个定义的函数参数里不是地址,这会有问题。
这块特别是在foreach这块的php实现上可能有一点缺陷也好,总之,想抛弃c的&取地址符号是php简单的根源。
执行结果如下:
---------- 调试PHP ----------
Deprecated: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of test1(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in D:\wamp\www\array_walk.php on line 11
PHP Deprecated: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of test1(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in D:\wamp\www\array_walk.php on line 11
输出完成 (耗时 0 秒) - 正常终止
像pdo的foreach陷阱和这有关,究其原因, 也就是bindParam和bindValue的不同之处, bindParam要求第二个参数是一个引用变量(reference),引用这种东东在PHP里出现其实怎么说好呢,有它有好处,用不好大大的坏,陷阱的根源,像c不是c的PHP的问题是PHP发展的争议根源,如果多都用c里的特性,那PHP完全可以成为一个类java的常驻内存server,乃至内存实现上也可有进步,但会编写复杂,掌握难度加大:
http://weibo.com/1170999921/ylgFcpe1f
http://www.laruence.com/2012/10/16/2831.html
https://jackxiang.com/post/7425/
Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of getimagesize(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. ind:\vhost\include\inc_custom_fields.php on line178
*/
我把php.ini的display_errors = on改成display_errors = off // (不显示错误)
就不显示了。
虽然没有什么影响。但是心里还是有个疙瘩。。。
百度上没有找到什么答案,然后在google上 找到了。
修改php.ini就可以了。
1. 在PHP.ini中搜索关键字 : allow_call_time_pass_reference 没有的自行建立。
2. 将 Off 改成 On ,Web Server重起就OK了~
allow_call_time_pass_reference = Off 变成 allow_call_time_pass_reference = On
ps
文档注解为:
是否启用在函数调用时强制参数被按照引用传递。此方法已不被赞成并在 PHP/Zend 未来的版本中很可能不再支持。鼓励使用的方法是在函数定义中指定哪些参数应该用引用传递。鼓励大家尝试关闭此选项并确保脚本能够正常运行,以确保该脚本也能在未来的版本中运行(每次使用此特性都会收到一条警告,参数会被按值传递而不是按照引用传递)。
在函数调用时通过引用传递参数是不推荐的,因为它影响到了代码的整洁。如果函数的参数没有声明作为引用传递,函数可以通过未写入文档的方法修改其参数。要避免其副作用,最好仅在函数声明时指定那个参数需要通过引用传递。
可以在函数里修改外面变量的值:
这样写就有前面描述的一系列问题:
说白了就是不能传一个地址给一个定义的函数参数里不是地址,这会有问题。
这块特别是在foreach这块的php实现上可能有一点缺陷也好,总之,想抛弃c的&取地址符号是php简单的根源。
执行结果如下:
---------- 调试PHP ----------
Deprecated: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of test1(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in D:\wamp\www\array_walk.php on line 11
PHP Deprecated: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of test1(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in D:\wamp\www\array_walk.php on line 11
输出完成 (耗时 0 秒) - 正常终止
像pdo的foreach陷阱和这有关,究其原因, 也就是bindParam和bindValue的不同之处, bindParam要求第二个参数是一个引用变量(reference),引用这种东东在PHP里出现其实怎么说好呢,有它有好处,用不好大大的坏,陷阱的根源,像c不是c的PHP的问题是PHP发展的争议根源,如果多都用c里的特性,那PHP完全可以成为一个类java的常驻内存server,乃至内存实现上也可有进步,但会编写复杂,掌握难度加大:
http://weibo.com/1170999921/ylgFcpe1f
http://www.laruence.com/2012/10/16/2831.html
https://jackxiang.com/post/7425/
PHP版本求佛祖无BUG保佑文件头备案。
Php/Js/Shell/Go jackxiang 2014-8-21 14:47
为嘛子要慎用mysql的enum字段?
Php/Js/Shell/Go jackxiang 2014-7-30 16:17
背景:时下都流行enum类型的使用tinyint,那enum就真没有用的价值了么?
PHP低级编程的兄弟是这样来看这个问题的,我作下笔录如下,期望能客观的理解这个enum字段的优点及缺点:
膘哥观点:
enum有优点。但个人觉得。。。缺点更多,客观的讲:优点主要是在建数据 库的时候就可以把一些值给规范好。缺点是。。enum不适合PHP。主要是PHP是弱类型,如:你insert into ..... set a= 1,你没法知道你是想 a= '1' 还是 a= 1(a='1'是插入值1,a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号。),这是PHP和mysql 在使用enum 最大的问题。所以。。安心点啦。干脆点直接tinyint。
单曲观点:
我觉得没什么优点,对数字型的enum,简直就是梦魇,boolean tinyint(1) 0,1 status tinyint(1) 1,2,3,4,5,6..tinyint欢淫你~~。如:audit_result enum(1,2,3),set audit_result = 1;...容易出现膘哥所说的混淆。
简单观点:
少用,一般都是用tinyint替代。
天枫观点:
我觉得除了状态直观 没什么优点,我一般直接int,tinyint([1or2or3]) 到底有啥区别?(后面会简单探讨下,这里面的1or2or3区别。)
中庸观点:
a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号,基本上是不加引号的。
竖琴螺观点:
六种情况就:tinyint(1) -1,-2,1,2,3,4
上面各种观点重点集中在PHP这种弱类型语言对引号不重视,
程序员不写容易引起插入的语句不是自己想要的结果的问题,
容易出现int时没有用引号导致插入了新值而不是定的那个值:
结论:要插入enum的值,字段必须加引号,不加引号当然是数字,数字就是key,不是value。
规劝:
1)enum是整型这样的错误很容易发生,尤其是php弱类型的,一般新来一个人,没注意enum类型,就会犯错。
2)数据库说明清楚的话,或者可选择的全是字符串的话,还没什么,但是里面有数字,难免有新手犯错,养成加引号的习惯很重要。
最终结论:
历史原因,要把enum改成tinyint程序改动太大了,用了的没必要改·~,以后新建的时候,尽量使用tinyint就好。
这种字段的重复内容过多的,索引建不建,关系不大,这种在mysql叫索引的势太低,其查询效果不太好:(英文是这么翻译的:https://jackxiang.com/post/1405/)。
————————————————————————————————————————————————————————————————————
tinyint(1)和tinyint(4)一样的,都是-127到128或者0到256。unsigned属性全是正,和c语言unsigned int有点类似:
tinyint(1) -128 ~ 127
tinyint(1) unsigned 0 ~ 255
为何表示的最大正数比最小负数的绝对值少1呢?
第一位是符号位,1表示负数
所以负数可以到128,正数只能到127
-128正127
如:0111 1111 正数 ,负数 1111 1111
提问:
Mysql里int(1)和int(11)差别很大的,mysql的int,有个属性 ,UNSIGNED ZEROFILL 后面的ZEROFILL,就是有定义的位数不够则用零补齐对齐一下(这儿可能涉及到索引的性能罢):int, 长度(M)=5, 属性=UNSIGNED ZEROFILL(无符号,用0来填充位数),00001,00002。
但这个tinyint呢,tinyint(1)和tinyint(4)一样的?
看这文章后:http://blog.csdn.net/lysygyy/article/details/5983433
我估计:mysql这块对一个字节不像int这种四个字节要进行对其前部分进行部分字节索引,如果说tinyint(1)和tinyint(4)是一样的表示范围情况下,但mysql对tinyint数字长度位数作了可设置的限定,从理论上说其存在硬盘里的字节是不一样才是合乎逻辑的,这块估计还是为了对字节进行对齐方便索引等,以提升效率为主罢,l如:ike keyword% 索引有效,如果统一对齐,索引效果会不会更好呢?我也只是猜测。
————————————————————————————————————————————————————————————————————
在网上找了下这个enum的mysql的大体实现如下:
一)enum的存储原理我仔细查看了下手册。是这样的:
在建立这个字段时,我们会给他规定一个范围比如enum('a','b','c'),这时mysql内部会建立一张hash结构的map表,类似:0000 -> a,0001 -> b,0002 -> c。
当我插入一条数据,此字段的值位a或b或c时,他存储在里面的不是这个字符,而是对应他的索引,也就是那个0000或0001或0002。
同样,enum在mysql手册上的说明:
ENUM('value1','value2',...)
1或2个字节,取决于枚举值的个数(最多65,535个值)
除非enum的个数超过了一定数量,否则他所占的存储空间也总是1字节。
二)tinyint:
类型 字节 最小值 最大值
(带符号的/无符号的) (带符号的/无符号的)
TINYINT 1 -128 127
他的最小存储所占空间也是1字节。
最后,Enum,既然要用它,就不必要使用什么0,1,2来代替实际的字符串了。甚至中文字符串。他并不会对数据库性能进行多余开销。因为对于它来说,你使用'0','1','2'和'张三','李四','王五'数据表所占的存储空间一样。但是考虑到我们实际应用时数据需要从db服务器回传到web app,所以在网络传输时,当然还是尽可能的传输小数据比较好。所以如果很在意这些,还是不用它好了。
mysql中关于bit,enum,tinyint三种数据类型的差别 :
http://blog.csdn.net/shadowsniper/article/details/7071004
慎用mysql的enum字段:
http://www.neatstudio.com/show-1498-1.shtml
PHP低级编程的兄弟是这样来看这个问题的,我作下笔录如下,期望能客观的理解这个enum字段的优点及缺点:
膘哥观点:
enum有优点。但个人觉得。。。缺点更多,客观的讲:优点主要是在建数据 库的时候就可以把一些值给规范好。缺点是。。enum不适合PHP。主要是PHP是弱类型,如:你insert into ..... set a= 1,你没法知道你是想 a= '1' 还是 a= 1(a='1'是插入值1,a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号。),这是PHP和mysql 在使用enum 最大的问题。所以。。安心点啦。干脆点直接tinyint。
单曲观点:
我觉得没什么优点,对数字型的enum,简直就是梦魇,boolean tinyint(1) 0,1 status tinyint(1) 1,2,3,4,5,6..tinyint欢淫你~~。如:audit_result enum(1,2,3),set audit_result = 1;...容易出现膘哥所说的混淆。
简单观点:
少用,一般都是用tinyint替代。
天枫观点:
我觉得除了状态直观 没什么优点,我一般直接int,tinyint([1or2or3]) 到底有啥区别?(后面会简单探讨下,这里面的1or2or3区别。)
中庸观点:
a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号,基本上是不加引号的。
竖琴螺观点:
六种情况就:tinyint(1) -1,-2,1,2,3,4
上面各种观点重点集中在PHP这种弱类型语言对引号不重视,
程序员不写容易引起插入的语句不是自己想要的结果的问题,
容易出现int时没有用引号导致插入了新值而不是定的那个值:
结论:要插入enum的值,字段必须加引号,不加引号当然是数字,数字就是key,不是value。
规劝:
1)enum是整型这样的错误很容易发生,尤其是php弱类型的,一般新来一个人,没注意enum类型,就会犯错。
2)数据库说明清楚的话,或者可选择的全是字符串的话,还没什么,但是里面有数字,难免有新手犯错,养成加引号的习惯很重要。
最终结论:
历史原因,要把enum改成tinyint程序改动太大了,用了的没必要改·~,以后新建的时候,尽量使用tinyint就好。
这种字段的重复内容过多的,索引建不建,关系不大,这种在mysql叫索引的势太低,其查询效果不太好:(英文是这么翻译的:https://jackxiang.com/post/1405/)。
————————————————————————————————————————————————————————————————————
tinyint(1)和tinyint(4)一样的,都是-127到128或者0到256。unsigned属性全是正,和c语言unsigned int有点类似:
tinyint(1) -128 ~ 127
tinyint(1) unsigned 0 ~ 255
为何表示的最大正数比最小负数的绝对值少1呢?
第一位是符号位,1表示负数
所以负数可以到128,正数只能到127
-128正127
如:0111 1111 正数 ,负数 1111 1111
提问:
Mysql里int(1)和int(11)差别很大的,mysql的int,有个属性 ,UNSIGNED ZEROFILL 后面的ZEROFILL,就是有定义的位数不够则用零补齐对齐一下(这儿可能涉及到索引的性能罢):int, 长度(M)=5, 属性=UNSIGNED ZEROFILL(无符号,用0来填充位数),00001,00002。
但这个tinyint呢,tinyint(1)和tinyint(4)一样的?
看这文章后:http://blog.csdn.net/lysygyy/article/details/5983433
我估计:mysql这块对一个字节不像int这种四个字节要进行对其前部分进行部分字节索引,如果说tinyint(1)和tinyint(4)是一样的表示范围情况下,但mysql对tinyint数字长度位数作了可设置的限定,从理论上说其存在硬盘里的字节是不一样才是合乎逻辑的,这块估计还是为了对字节进行对齐方便索引等,以提升效率为主罢,l如:ike keyword% 索引有效,如果统一对齐,索引效果会不会更好呢?我也只是猜测。
————————————————————————————————————————————————————————————————————
在网上找了下这个enum的mysql的大体实现如下:
一)enum的存储原理我仔细查看了下手册。是这样的:
在建立这个字段时,我们会给他规定一个范围比如enum('a','b','c'),这时mysql内部会建立一张hash结构的map表,类似:0000 -> a,0001 -> b,0002 -> c。
当我插入一条数据,此字段的值位a或b或c时,他存储在里面的不是这个字符,而是对应他的索引,也就是那个0000或0001或0002。
同样,enum在mysql手册上的说明:
ENUM('value1','value2',...)
1或2个字节,取决于枚举值的个数(最多65,535个值)
除非enum的个数超过了一定数量,否则他所占的存储空间也总是1字节。
二)tinyint:
类型 字节 最小值 最大值
(带符号的/无符号的) (带符号的/无符号的)
TINYINT 1 -128 127
他的最小存储所占空间也是1字节。
最后,Enum,既然要用它,就不必要使用什么0,1,2来代替实际的字符串了。甚至中文字符串。他并不会对数据库性能进行多余开销。因为对于它来说,你使用'0','1','2'和'张三','李四','王五'数据表所占的存储空间一样。但是考虑到我们实际应用时数据需要从db服务器回传到web app,所以在网络传输时,当然还是尽可能的传输小数据比较好。所以如果很在意这些,还是不用它好了。
mysql中关于bit,enum,tinyint三种数据类型的差别 :
http://blog.csdn.net/shadowsniper/article/details/7071004
慎用mysql的enum字段:
http://www.neatstudio.com/show-1498-1.shtml
[实践OK]为PHP5.4开启Zend OPCode opcache缓存,加速效果好,高版本Memcache扩展都带上了。
Php/Js/Shell/Go jackxiang 2014-7-19 00:35
背景:最近vps上安了PHP Version 5.4.30,没有加速器...性能不高,加上vps硬件不行,还得加上一个ea啥的,apc,有一个lpcache.so不错,安上。
PHP5.5开始内置了Zend OPcache的缓存系统,这个系统在5.2-5.4下也是可以使用的。经过测试,在php5.4下的加速性能明显,效果比5.2+ea还要好,在此推荐安装。
CentOS6中yum源中已经有git的版本了,可以直接使用yum源进行安装
yum -y install git
编译步骤:
git clone git://github.com/zend-dev/ZendOptimizerPlus.git
cd ZendOptimizerPlus
$PHP_DIR/bin/phpize
./configure \
--with-php-config=$PHP_DIR/bin/php-config
make && make install
./configure --with-php-config=/usr/local/php/bin/php-config
配置步骤:
在 php.ini 内增加
zend_extension=/...full path.../opcache.so
下面这段是官方推荐的配置参数,可以更加提升性能,建议使用:
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
另:PHP5.5下只需要编译时增加 --enable-opcache 参数即可:
静态编译配置不配置无所谓了?
PHP是这样的:
[root@jackxiang ~]# php -v
PHP 5.5.15 (cli) (built: Aug 10 2014 15:18:31)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
但好像用那个下载的php统计好像说是没有发现这个opcache,奇了怪了,呵。
ocp.php?FILES=1&GROUP=2&SORT=3
出现:Opcache not detected?
原因:
配置好这个opcache后没有重启php-fpm,所以,重启动好了。
[root@jackxiang ~]# php -m|grep OP
Zend OPcache
Zend OPcache
————————————————————————————————————————
出现:You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
如果想看到底命中多少百分比的opcache,有个php可以运行下:
https://gist.github.com/ck-on/4959032/download#
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
说需要安装re2c
执行以下命令
wget http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download
tar -zxvf re2c-0.13.5.tar.gz
cd re2c-0.13.5
./configure && make && make install
推荐使用:Zend OPcache 控制面板:
https://gist.github.com/ck-on/4959032
来自:http://chen.so/post/71/
http://www.laogui.com/Zend-Opcache
新一代 PHP 加速插件 Zend Opcache:
http://www.laogui.com/Zend-Opcache
最后,
效果还是有的,这个数值表现出的效果是相当的明显:
Cache hits 15338969
Cache misses 294
————————————————————————————
op于ea的性能对比:http://dafengzi.com/?p=4
是否可以一起安,更牛x呀,哈哈:Add Time:2014-08-20
————————————PHP高级研究群———————————————
PHP里的Zend的OPcache 和 eaccelerator 同时使用是不是效果更好?
上午 10:49:58
啥也不会
14/8/20 星期三 上午 10:49:58
会冲突
七夜
14/8/20 星期三 上午 10:51:58
直接opcache就行
————————————低级PHP码农———————————————
PHP里的Zend的OPcache 和 eaccelerator 同时使用是不是效果更好?
【活跃】[沪部]-莫莫
14/8/20 星期三 上午 10:40:19
胡扯的吧
【活跃】[沪部]-莫莫
14/8/20 星期三 上午 10:40:28
opcache 选一个吧
【活跃】[沪部]-莫莫
14/8/20 星期三 上午 10:40:33
选opcache 吧
上午 10:40:50
【活跃】[沪部]-莫莫
14/8/20 星期三 上午 10:40:50
两个功能重叠了 你觉得好吗?【
听说高版本的PHP连Memcache都自带了,莫莫给了一文章:
http://blog.csdn.net/zqtsx/article/details/23942605
摘录片段:
安装MEMCACHE,和OPCACHE扩展
(因为php5.5X+版本已经内置了memcache和opcache扩展,所以不必另行下载,即可采用以下方式进行编译)
1.memcache
如果需要为php增加memcache扩展,按如下方法进行:
cd /usr/local/php/bin
./pecl install memcache
安装时会提示是否开启session支持,根据需要输入no 或者 yes,安装后路径如下:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/memcache.so
需要手动配置到php.ini中,增加如下内容,即表示启用memcache扩展:
extension=memcache.so
保存后,重启Apache,或PHP-FPM。
/usr/local/php/bin/pecl install memcache
Installing shared extensions: /tmp/pear/temp/pear-build-root9N8MRR/install-memcache-2.2.7/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/
一阵编译......
Build process completed successfully
Installing '/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/memcache.so'
install ok: channel://pecl.php.net/memcache-2.2.7
configuration option "php_ini" is not set to php.ini location
You should add "extension=memcache.so" to php.ini
service php-fpm restart
看样子,这个pecl是想做一个类linux的yum 或apt-get啊。
PHP5.5开始内置了Zend OPcache的缓存系统,这个系统在5.2-5.4下也是可以使用的。经过测试,在php5.4下的加速性能明显,效果比5.2+ea还要好,在此推荐安装。
CentOS6中yum源中已经有git的版本了,可以直接使用yum源进行安装
yum -y install git
编译步骤:
git clone git://github.com/zend-dev/ZendOptimizerPlus.git
cd ZendOptimizerPlus
$PHP_DIR/bin/phpize
./configure \
--with-php-config=$PHP_DIR/bin/php-config
make && make install
./configure --with-php-config=/usr/local/php/bin/php-config
配置步骤:
在 php.ini 内增加
zend_extension=/...full path.../opcache.so
下面这段是官方推荐的配置参数,可以更加提升性能,建议使用:
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
另:PHP5.5下只需要编译时增加 --enable-opcache 参数即可:
静态编译配置不配置无所谓了?
PHP是这样的:
[root@jackxiang ~]# php -v
PHP 5.5.15 (cli) (built: Aug 10 2014 15:18:31)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
但好像用那个下载的php统计好像说是没有发现这个opcache,奇了怪了,呵。
ocp.php?FILES=1&GROUP=2&SORT=3
出现:Opcache not detected?
原因:
配置好这个opcache后没有重启php-fpm,所以,重启动好了。
[root@jackxiang ~]# php -m|grep OP
Zend OPcache
Zend OPcache
————————————————————————————————————————
出现:You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
如果想看到底命中多少百分比的opcache,有个php可以运行下:
https://gist.github.com/ck-on/4959032/download#
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
说需要安装re2c
执行以下命令
wget http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download
tar -zxvf re2c-0.13.5.tar.gz
cd re2c-0.13.5
./configure && make && make install
推荐使用:Zend OPcache 控制面板:
https://gist.github.com/ck-on/4959032
来自:http://chen.so/post/71/
http://www.laogui.com/Zend-Opcache
新一代 PHP 加速插件 Zend Opcache:
http://www.laogui.com/Zend-Opcache
最后,
效果还是有的,这个数值表现出的效果是相当的明显:
Cache hits 15338969
Cache misses 294
————————————————————————————
op于ea的性能对比:http://dafengzi.com/?p=4
是否可以一起安,更牛x呀,哈哈:Add Time:2014-08-20
————————————PHP高级研究群———————————————
PHP里的Zend的OPcache 和 eaccelerator 同时使用是不是效果更好?
上午 10:49:58
啥也不会
14/8/20 星期三 上午 10:49:58
会冲突
七夜
14/8/20 星期三 上午 10:51:58
直接opcache就行
————————————低级PHP码农———————————————
PHP里的Zend的OPcache 和 eaccelerator 同时使用是不是效果更好?
【活跃】[沪部]-莫莫
14/8/20 星期三 上午 10:40:19
胡扯的吧
【活跃】[沪部]-莫莫
14/8/20 星期三 上午 10:40:28
opcache 选一个吧
【活跃】[沪部]-莫莫
14/8/20 星期三 上午 10:40:33
选opcache 吧
上午 10:40:50
【活跃】[沪部]-莫莫
14/8/20 星期三 上午 10:40:50
两个功能重叠了 你觉得好吗?【
听说高版本的PHP连Memcache都自带了,莫莫给了一文章:
http://blog.csdn.net/zqtsx/article/details/23942605
摘录片段:
安装MEMCACHE,和OPCACHE扩展
(因为php5.5X+版本已经内置了memcache和opcache扩展,所以不必另行下载,即可采用以下方式进行编译)
1.memcache
如果需要为php增加memcache扩展,按如下方法进行:
cd /usr/local/php/bin
./pecl install memcache
安装时会提示是否开启session支持,根据需要输入no 或者 yes,安装后路径如下:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/memcache.so
需要手动配置到php.ini中,增加如下内容,即表示启用memcache扩展:
extension=memcache.so
保存后,重启Apache,或PHP-FPM。
/usr/local/php/bin/pecl install memcache
Installing shared extensions: /tmp/pear/temp/pear-build-root9N8MRR/install-memcache-2.2.7/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/
一阵编译......
Build process completed successfully
Installing '/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/memcache.so'
install ok: channel://pecl.php.net/memcache-2.2.7
configuration option "php_ini" is not set to php.ini location
You should add "extension=memcache.so" to php.ini
service php-fpm restart
看样子,这个pecl是想做一个类linux的yum 或apt-get啊。
myisam 表 转换为 innodb 表
Php/Js/Shell/Go jackxiang 2014-7-18 14:08
从InnoDB引擎转换成MyISAM引擎,看完本文,你应该懂得如何操作以把MyISAM引擎转换成InnoDB引擎了(请确保InnoDB开启,MySQL命令行下SHOW ENGINES命令查看)。
mysql> ALTER TABLE boblog_history ENGINE=InnoDB;
Query OK, 2808 rows affected (0.76 sec)
Records: 2808 Duplicates: 0 Warnings: 0
ALTER TABLE boblog_blogs ENGINE=InnoDB;
ALTER TABLE boblog_calendar ENGINE=InnoDB;
ALTER TABLE boblog_categoriesENGINE=InnoDB;
ALTER TABLE boblog_counter ENGINE=InnoDB;
ALTER TABLE boblog_forbidden ENGINE=InnoDB;
ALTER TABLE boblog_history ENGINE=InnoDB;
ALTER TABLE boblog_linkgroup ENGINE=InnoDB;
ALTER TABLE boblog_links ENGINE=InnoDB;
ALTER TABLE boblog_maxrec ENGINE=InnoDB;
ALTER TABLE boblog_messages ENGINE=InnoDB;
ALTER TABLE boblog_mods ENGINE=InnoDB;
ALTER TABLE boblog_pages ENGINE=InnoDB;
ALTER TABLE boblog_plugins ENGINE=InnoDB;
ALTER TABLE boblog_replies ENGINE=InnoDB;
ALTER TABLE boblog_tags ENGINE=InnoDB;
ALTER TABLE boblog_upload ENGINE=InnoDB;
ALTER TABLE boblog_user ENGINE=InnoDB;
来自:http://www.samhere.net/mysql_innodb_to_myisam.html
mysql> ALTER TABLE boblog_history ENGINE=InnoDB;
Query OK, 2808 rows affected (0.76 sec)
Records: 2808 Duplicates: 0 Warnings: 0
ALTER TABLE boblog_blogs ENGINE=InnoDB;
ALTER TABLE boblog_calendar ENGINE=InnoDB;
ALTER TABLE boblog_categoriesENGINE=InnoDB;
ALTER TABLE boblog_counter ENGINE=InnoDB;
ALTER TABLE boblog_forbidden ENGINE=InnoDB;
ALTER TABLE boblog_history ENGINE=InnoDB;
ALTER TABLE boblog_linkgroup ENGINE=InnoDB;
ALTER TABLE boblog_links ENGINE=InnoDB;
ALTER TABLE boblog_maxrec ENGINE=InnoDB;
ALTER TABLE boblog_messages ENGINE=InnoDB;
ALTER TABLE boblog_mods ENGINE=InnoDB;
ALTER TABLE boblog_pages ENGINE=InnoDB;
ALTER TABLE boblog_plugins ENGINE=InnoDB;
ALTER TABLE boblog_replies ENGINE=InnoDB;
ALTER TABLE boblog_tags ENGINE=InnoDB;
ALTER TABLE boblog_upload ENGINE=InnoDB;
ALTER TABLE boblog_user ENGINE=InnoDB;
来自:http://www.samhere.net/mysql_innodb_to_myisam.html