[转]set_error_handler() 重要用法
Php/Js/Shell/Go jackxiang 2013-7-4 16:17
背景:
群里有兄弟在问:
我在PHP.ini里 display=off屏蔽了错误,然后把错误信息 写入到LOG里
怎么搞?
一)
set_exception_handler
set_error_handler
二)php.ini里配置:
log_errors = On
error_log = /data/logs/php_error.log
阅读全文
群里有兄弟在问:
我在PHP.ini里 display=off屏蔽了错误,然后把错误信息 写入到LOG里
怎么搞?
一)
set_exception_handler
set_error_handler
二)php.ini里配置:
log_errors = On
error_log = /data/logs/php_error.log
阅读全文
PHP5.5集成opcache(开源版Zend Optimizer+)
Php/Js/Shell/Go jackxiang 2013-7-4 15:44
PHP处理control-M字符(^M)的方式
Php/Js/Shell/Go jackxiang 2013-6-24 14:31
背景:在接口有奇怪的符号,如下:
^M
^M
{"code":"0","msg":"参数无效"}
代码(把^M 和换行全替换成空: \r\n 在Unix下显示是:^M且换行了):
现在好了。没有换行也没有M了,也可:
vim编辑下,然后: :%s/\r\+$//e
如直接用PHP的trim替换后,还是有换行,只是^m没了。就是下文的直接替换:
阅读全文
^M
^M
{"code":"0","msg":"参数无效"}
代码(把^M 和换行全替换成空: \r\n 在Unix下显示是:^M且换行了):
现在好了。没有换行也没有M了,也可:
vim编辑下,然后: :%s/\r\+$//e
如直接用PHP的trim替换后,还是有换行,只是^m没了。就是下文的直接替换:
阅读全文
cp /opt/harbor/harbor.cfg{,.ori}
harbor.cfg ==> harbor.cfg.ori
方法一:yes|cp -r /x y
cp -rf 即使使用了f 每个文件仍然会询问。 yes|可以解决这个问题。
方法二:(加右斜杠)
Linux使用cp命令直接覆盖不提示的方法
普通的cp命令使用
例如:cp abc.txt /home
如果/home里面之前有abc.txt文件,会提示你是否要覆盖?这个时候你需要输入Y,假如文件很多的话,每复制一个文件都要输入一次Y.
下面介绍cp文件时直接覆盖不提示的方法
命令如下:
\cp abc.txt /home
直接复制abc.txt 到/home 里面,不管/home 里面之前是否有这个文件都会直接覆盖,不再出现覆盖提示!
原因:alias 成cp -r了
vi ~/.bashrc
alias cp='cp -i'
——————————————————————————————————————————————————————
新做了服务器,cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,这在大量cp覆盖操作的时候是不能忍受的。
把a目录下的文件复制到b目录
cp –r a/* b
执行上面的命令时,b存在的每个文件都会提示是否覆盖;
cp –r –f a/* b
执行上面的命令时,b存在的每个文件都不再会提示;
这是我们希望的理想状态,但是有时加了-f了,怎么还会有提示呢?原来一些服务器会默认增加别名 alias cp='cp -i',当你执行cp时,其实执行的是cp –i。
在终端执行alias就可以看出来了。
[root@devdb ~]# alias
alias cp='cp -i'
可以这样解决
[root@devdb ~]# vi ~/.bashrc
在alias cp='cp -i'前加上"#"注释掉这行,:wq!保存推出,然后重新登陆就可以了。
来自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3637144&highlight=
http://soft.chinabyte.com/os/220/11760720.shtml
cURL error: name lookup timed out 这种错误怎么捕获到?linux服务器因nameservers停止工作,导致name lookup timed out的解决方法。
Php/Js/Shell/Go jackxiang 2013-6-21 11:34
背景:用PHP的Curl调用对方的接口,居然返回 curl error: name lookup timed out,一堆错,显然是服务器间歇性抽风。
strace了下发现:
我发现抽风的服务器可以通过--connect-timeout 来减少给接口调用方直接提示:name lookup timed out,
是用curl发现这个问题的:
curl的超时时间设置:
使用curl时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间。
连接超时时间用 --connect-timeout 参数来指定,数据传输的最大允许时间用 -m 参数来指定。
例如:
curl --connect-timeout 10 -m 20 "http://XXXXXXX"
连接超时的话,出错提示形如:
curl: (28) connect() timed out!
数据传输的最大允许时间超时的话,出错提示形如:
curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received
--connect-timeout时间短,对本机的接口(接口再访问其它域名的机器)多次访问出现几率大:
According to cURL Error Codes, error code 6 stands for Couldn't resolve host. The given remote host was not resolved.
So I guess your DNS was not propagating properly at times ?
Under the hood, both curl_exec and file_get_contents perform nearly identical operations; they both use libresolv to:
connect to a name server
issue a dns request
process the dns response
To further debug this, you can use curl_getinfo() to get detailed statistics about your requests; you can use this to get an idea of how long each part took using:
CURLINFO_NAMELOOKUP_TIME
CURLINFO_CONNECT_TIME
CURLINFO_PRETRANSFER_TIME
...
The value of
the ptr variable is "name lookup timed out".
I am using the curl_easy interface. I am *not* setting
CURLOPT_NOSIGNAL, and I am also *not* setting any timeout options
(such as CURLOPT_TIMEOUT). My guess is that this crash is caused by a
signal that is emitted. I suspect that I need to set CURLOPT_NOSIGNAL
to 1L and then configure libcurl to use c-ares.
---------------------------------------------------------------------------------------
linux服务器因nameservers停止工作,导致name lookup timed out的解决方法。
刚服务器上的所有在线代理网站突然出现name lookup timed out问题,网上搜索了一下原来是服务器的nameservers问题,打开/etc/resolv.conf,看到
search box.net
nameserver 66.90.68.15
nameserver 66.90.68.169 v. m$ V- V% d, p% d, e
8 {; n5 t: M) Z% W
ping了下66.90.68.15果然不工作了! k4 v! @: x, ]3 \6 Y, ]0 ?0 n
* K, `5 n( m/ H7 X& B+ ]- n2 a
随便在google里输入“free nameservers”找到这家9 U/ J% b. ]* O* E# i, \' [
http://www.resolvingnameserver.com/freerns.html
Our current set of name servers that you can use are:+ F6 I# b3 s, L* |! F
205.234.170.215
205.234.170.217
打开resolv.conf,替换掉原来的IP,上传。- t) x0 \! j8 y
8 K" g8 e; x) T" k6 d: e
重启下服务器,问题解决。
( s8 r: {0 P$ D) r& j; I7 Q
其实还有一家比较有名的我以前介绍过
http://www.opendns.com/
208.67.222.222
208.67.220.220
我自己的windows计算机上用过,不过如果网站打开慢的话会出现他们的广告,不是很爽,希望使用的这家不要出现这样的情况。
) E, ]+ k8 _1 X
2009年3月25日更新:9 F8 ~. O3 c6 U6 f
205.234.170.215
205.234.170.217
有点慢,有时还是会出现“name lookup timed out”的情况,所以我还是选择了5 }& D5 k% s8 F7 V
208.67.222.222
208.67.220.220
来自:http://www.9125.info/redirect.php?fid=5&tid=286&goto=nextnewset
strace了下发现:
我发现抽风的服务器可以通过--connect-timeout 来减少给接口调用方直接提示:name lookup timed out,
是用curl发现这个问题的:
curl的超时时间设置:
使用curl时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间。
连接超时时间用 --connect-timeout 参数来指定,数据传输的最大允许时间用 -m 参数来指定。
例如:
curl --connect-timeout 10 -m 20 "http://XXXXXXX"
连接超时的话,出错提示形如:
curl: (28) connect() timed out!
数据传输的最大允许时间超时的话,出错提示形如:
curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received
--connect-timeout时间短,对本机的接口(接口再访问其它域名的机器)多次访问出现几率大:
According to cURL Error Codes, error code 6 stands for Couldn't resolve host. The given remote host was not resolved.
So I guess your DNS was not propagating properly at times ?
Under the hood, both curl_exec and file_get_contents perform nearly identical operations; they both use libresolv to:
connect to a name server
issue a dns request
process the dns response
To further debug this, you can use curl_getinfo() to get detailed statistics about your requests; you can use this to get an idea of how long each part took using:
CURLINFO_NAMELOOKUP_TIME
CURLINFO_CONNECT_TIME
CURLINFO_PRETRANSFER_TIME
...
The value of
the ptr variable is "name lookup timed out".
I am using the curl_easy interface. I am *not* setting
CURLOPT_NOSIGNAL, and I am also *not* setting any timeout options
(such as CURLOPT_TIMEOUT). My guess is that this crash is caused by a
signal that is emitted. I suspect that I need to set CURLOPT_NOSIGNAL
to 1L and then configure libcurl to use c-ares.
---------------------------------------------------------------------------------------
linux服务器因nameservers停止工作,导致name lookup timed out的解决方法。
刚服务器上的所有在线代理网站突然出现name lookup timed out问题,网上搜索了一下原来是服务器的nameservers问题,打开/etc/resolv.conf,看到
search box.net
nameserver 66.90.68.15
nameserver 66.90.68.169 v. m$ V- V% d, p% d, e
8 {; n5 t: M) Z% W
ping了下66.90.68.15果然不工作了! k4 v! @: x, ]3 \6 Y, ]0 ?0 n
* K, `5 n( m/ H7 X& B+ ]- n2 a
随便在google里输入“free nameservers”找到这家9 U/ J% b. ]* O* E# i, \' [
http://www.resolvingnameserver.com/freerns.html
Our current set of name servers that you can use are:+ F6 I# b3 s, L* |! F
205.234.170.215
205.234.170.217
打开resolv.conf,替换掉原来的IP,上传。- t) x0 \! j8 y
8 K" g8 e; x) T" k6 d: e
重启下服务器,问题解决。
( s8 r: {0 P$ D) r& j; I7 Q
其实还有一家比较有名的我以前介绍过
http://www.opendns.com/
208.67.222.222
208.67.220.220
我自己的windows计算机上用过,不过如果网站打开慢的话会出现他们的广告,不是很爽,希望使用的这家不要出现这样的情况。
) E, ]+ k8 _1 X
2009年3月25日更新:9 F8 ~. O3 c6 U6 f
205.234.170.215
205.234.170.217
有点慢,有时还是会出现“name lookup timed out”的情况,所以我还是选择了5 }& D5 k% s8 F7 V
208.67.222.222
208.67.220.220
来自:http://www.9125.info/redirect.php?fid=5&tid=286&goto=nextnewset
[时间转换]java 时间戳和PHP时间戳 的转换问题,13位毫秒获取。
Php/Js/Shell/Go jackxiang 2013-6-17 11:34
背景:ts 参数 时间戳毫秒级,13位的,我用的是PHP的,发现调用失败:
以下代码有点问题:
当mtime[0]是0.012 =>> 给*1000后小数后面的第一个零给去掉了,形成了12位的,不到13位,于是rango给出一个:
估计是后面的是00,所以没显示
比如:第一个其实是:1372057395.0100
后面两个0没显示,则会显示:1372057395.01,12位。
PHP时间戳长度是10位, 如:1294890859
而PHP的microtime()得出的是:
10位的Unix时间(秒)
8位的微妙
足够你用了.截取自己要的13位就可以了.
这里可能涉及到java 时间戳和PHP时间戳 的转换问题:
java时间戳和PHP时间戳 的转换问题:
由于精度不同,导致长度不一致,直接转换错误。
JAVA时间戳长度是13位,如:1294890876859
PHP时间戳长度是10位, 如:1294890859
主要最后三位的不同,JAVA时间戳在PHP中使用,去掉后三位,如:1294890876859-> 1294890876 结果:2011-01-13 11:54:36
echo date('Y-m-d H:i:s','1294890876');
PHP时间戳在JAVA中使用,最后加三位,用000补充,如:1294890859->1294890859000
结果:2011-01-13 11:54:19
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateTime = df.format(1294890859000L);
System.out.println(df);
来自:http://fghzhaopai.blog.163.com/blog/static/4780555620114137146287/
======================================================
Js实现:
10位的时间戳 转 脚本里乘1000 要么你直接后面加3个000 变成13位的 ,
估计也差不多 算成时间 秒位最小单位 基本没什么误差了
1s=1000ms(毫秒)=1000000(微秒)
1s=10^3ms(毫秒)=10^6μs(微秒)
IOS的 typedef long __darwin_time_t; /* time() */
time返回就是 long
不存在小数情况你这个IOS返回的是毫秒还是微秒?了解下。
是秒
那怎么获取到毫秒啊?
乘1000
取到的秒 是 10位的
以下代码有点问题:
当mtime[0]是0.012 =>> 给*1000后小数后面的第一个零给去掉了,形成了12位的,不到13位,于是rango给出一个:
估计是后面的是00,所以没显示
比如:第一个其实是:1372057395.0100
后面两个0没显示,则会显示:1372057395.01,12位。
PHP时间戳长度是10位, 如:1294890859
而PHP的microtime()得出的是:
10位的Unix时间(秒)
8位的微妙
足够你用了.截取自己要的13位就可以了.
这里可能涉及到java 时间戳和PHP时间戳 的转换问题:
java时间戳和PHP时间戳 的转换问题:
由于精度不同,导致长度不一致,直接转换错误。
JAVA时间戳长度是13位,如:1294890876859
PHP时间戳长度是10位, 如:1294890859
主要最后三位的不同,JAVA时间戳在PHP中使用,去掉后三位,如:1294890876859-> 1294890876 结果:2011-01-13 11:54:36
echo date('Y-m-d H:i:s','1294890876');
PHP时间戳在JAVA中使用,最后加三位,用000补充,如:1294890859->1294890859000
结果:2011-01-13 11:54:19
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateTime = df.format(1294890859000L);
System.out.println(df);
来自:http://fghzhaopai.blog.163.com/blog/static/4780555620114137146287/
======================================================
Js实现:
10位的时间戳 转 脚本里乘1000 要么你直接后面加3个000 变成13位的 ,
估计也差不多 算成时间 秒位最小单位 基本没什么误差了
1s=1000ms(毫秒)=1000000(微秒)
1s=10^3ms(毫秒)=10^6μs(微秒)
IOS的 typedef long __darwin_time_t; /* time() */
time返回就是 long
不存在小数情况你这个IOS返回的是毫秒还是微秒?了解下。
是秒
那怎么获取到毫秒啊?
乘1000
取到的秒 是 10位的
PHP多进程编程一,PHP多进程编程二。
Php/Js/Shell/Go jackxiang 2013-6-16 12:48
//阻塞父进程,直到子进程结束,不适合需要长时间运行的脚本,可使用pcntl_wait($status, 0)实现非阻塞式
pcntl_wait($status);
-------------------------------------------------------------------------------------------------------------------------------------------------------
PHP多进程编程一
使用PHP真正的多进程运行模式,适用于数据采集、邮件群发、数据源更新、tcp服务器等环节。
PHP有一组进程控制函数(编译时需要 –enable-pcntl与posix扩展),使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。PCNTL使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。
常用的PCNTL函数
pcntl_alarm ( int $seconds )设置一个$seconds秒后发送SIGALRM信号的计数器
pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ] )为$signo设置一个处理该信号的回调函数。下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:
pcntl_exec ( string $path [, array $args [, array $envs ]] )在当前的进程空间中执行指定程序,类似于c中的exec族函数。所谓当前空间,即载入指定程序的代码覆盖掉当前进程的空间,执行完该程序进程即结束。
pcntl_wait ( int &$status [, int $options ] )阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用:
1. 阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;
2. 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。
pcntl_waitpid ( int $pid , int &$status [, int $options ] )功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait一样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息,这个参数可以用于pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid这些函数。
例如:
子进程在输出child process等字样之后sleep了2秒才结束,而父进程阻塞着直到子进程退出之后才继续运行。
pcntl_getpriority ([ int $pid [, int $process_identifier ]] )取得进程的优先级,即nice值,默认为0,在我的测试环境的linux中(CentOS release 5.2 (Final)),优先级为-20到19,-20为优先级最高,19为最低。(手册中为-20到20)。
pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )设置进程的优先级。
posix_kill可以给进程发送信号
pcntl_singal用来设置信号的回调函数
当父进程退出时,子进程如何得知父进程的退出
当父进程退出时,子进程一般可以通过下面这两个比较简单的方法得知父进程已经退出这个消息:
当父进程退出时,会有一个INIT进程来领养这个子进程。这个INIT进程的进程号为1,所以子进程可以通过使用getppid()来取得当前父进程的pid。如果返回的是1,表明父进程已经变为INIT进程,则原进程已经推出。
使用kill函数,向原有的父进程发送空信号(kill(pid, 0))。使用这个方法对某个进程的存在性进行检查,而不会真的发送信号。所以,如果这个函数返回-1表示父进程已经退出。
除了上面的这两个方法外,还有一些实现上比较复杂的方法,比如建立管道或socket来进行时时的监控等等。
PHP多进程采集数据的例子
PHP多进程编程二
php在pcntl_fork()后生成的子进程(通常为僵尸进程)必须由pcntl_waitpid()函数进行资源释放。但在 pcntl_waitpid()不一定释放的就是当前运行的进程,也可能是过去生成的僵尸进程(没有释放);也可能是并发时其它访问者的僵尸进程。但可以 使用posix_kill($cid, SIGTERM)在子进程结束时杀掉它。
子进程会自动复制父进程空间里的变量。
PHP多进程编程示例2
如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:
pcntl_wait($status, 1);
//或
pcntl_wait($status, WNOHANG);
在上面的代码中,如果父进程退出(使用exit函数退出或redirect),则会导致子进程成为僵尸进程(会交给init进程控制),子进程不再执行。
僵 尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程。任何进程在退出前(使用exit退出)都会变成 僵尸进程(用于保存进程的状态等信息),然后由init进程接管。如果不及时回收僵尸进程,那么它在系统中就会占用一个进程表项,如果这种僵尸进程过多, 最后系统就没有可以用的进程表项,于是也无法再运行其它的程序。
预防僵尸进程有以下几种方法:
父 进程通过wait和waitpid等函数使其等待子进程结束,然后再执行父进程中的代码,这会导致父进程挂起。上面的代码就是使用这种方式实现的,但在 WEB环境下,它不适合子进程需要长时间运行的情况(会导致超时)。使用wait和waitpid方法使父进程自动回收其僵尸子进程(根据子进程的返回状 态),waitpid用于临控指定子进程,wait是对于所有子进程而言。
如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收
如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号,例如:pcntl_signal(SIGCHLD, SIG_IGN);
$pid = pcntl_fork();
//....code
还有一个技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程再fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。下面是一个例子:
在 fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进 程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为”孤儿进程”,过继给1号进程init,init会定期调用wait回收 清理这些父进程已退出的僵尸子进程。
所以,上面的示例可以改成:
怎样产生僵尸进程的
一 个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它 的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已 经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵 尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程 结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但 是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
任何一个子进程(init 除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的 阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是”Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。
如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
另外,还可以写一个php文件,然后在以后台形式来运行它,例如:
然后在insertLargeData.php文件中做数据库操作。也可以用cronjob + php的方式实现大数据量的处理。
如果是在终端运行php命令,当终端关闭后,刚刚执行的命令也会被强制关闭,如果你想让其不受终端关闭的影响,可以使用nohup命令实现:
[/codes]
//Action代码
public function createAction(){
//....
//将args替换成要传给insertLargeData.php的参数,参数间用空格间隔
system('nohup php -f insertLargeData.php ' . ' args ' . '&');
$this->redirect('/');
}
?>
[/codes]
你还可以使用screen命令代替nohup命令。
分别来自:
http://blog.zol.com.cn/2366/article_2365152.html
http://blog.zol.com.cn/2366/article_2365155.html
pcntl_wait($status);
-------------------------------------------------------------------------------------------------------------------------------------------------------
PHP多进程编程一
使用PHP真正的多进程运行模式,适用于数据采集、邮件群发、数据源更新、tcp服务器等环节。
PHP有一组进程控制函数(编译时需要 –enable-pcntl与posix扩展),使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。PCNTL使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。
常用的PCNTL函数
pcntl_alarm ( int $seconds )设置一个$seconds秒后发送SIGALRM信号的计数器
pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ] )为$signo设置一个处理该信号的回调函数。下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:
pcntl_exec ( string $path [, array $args [, array $envs ]] )在当前的进程空间中执行指定程序,类似于c中的exec族函数。所谓当前空间,即载入指定程序的代码覆盖掉当前进程的空间,执行完该程序进程即结束。
pcntl_wait ( int &$status [, int $options ] )阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用:
1. 阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;
2. 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。
pcntl_waitpid ( int $pid , int &$status [, int $options ] )功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait一样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息,这个参数可以用于pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid这些函数。
例如:
子进程在输出child process等字样之后sleep了2秒才结束,而父进程阻塞着直到子进程退出之后才继续运行。
pcntl_getpriority ([ int $pid [, int $process_identifier ]] )取得进程的优先级,即nice值,默认为0,在我的测试环境的linux中(CentOS release 5.2 (Final)),优先级为-20到19,-20为优先级最高,19为最低。(手册中为-20到20)。
pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )设置进程的优先级。
posix_kill可以给进程发送信号
pcntl_singal用来设置信号的回调函数
当父进程退出时,子进程如何得知父进程的退出
当父进程退出时,子进程一般可以通过下面这两个比较简单的方法得知父进程已经退出这个消息:
当父进程退出时,会有一个INIT进程来领养这个子进程。这个INIT进程的进程号为1,所以子进程可以通过使用getppid()来取得当前父进程的pid。如果返回的是1,表明父进程已经变为INIT进程,则原进程已经推出。
使用kill函数,向原有的父进程发送空信号(kill(pid, 0))。使用这个方法对某个进程的存在性进行检查,而不会真的发送信号。所以,如果这个函数返回-1表示父进程已经退出。
除了上面的这两个方法外,还有一些实现上比较复杂的方法,比如建立管道或socket来进行时时的监控等等。
PHP多进程采集数据的例子
PHP多进程编程二
php在pcntl_fork()后生成的子进程(通常为僵尸进程)必须由pcntl_waitpid()函数进行资源释放。但在 pcntl_waitpid()不一定释放的就是当前运行的进程,也可能是过去生成的僵尸进程(没有释放);也可能是并发时其它访问者的僵尸进程。但可以 使用posix_kill($cid, SIGTERM)在子进程结束时杀掉它。
子进程会自动复制父进程空间里的变量。
PHP多进程编程示例2
如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:
pcntl_wait($status, 1);
//或
pcntl_wait($status, WNOHANG);
在上面的代码中,如果父进程退出(使用exit函数退出或redirect),则会导致子进程成为僵尸进程(会交给init进程控制),子进程不再执行。
僵 尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程。任何进程在退出前(使用exit退出)都会变成 僵尸进程(用于保存进程的状态等信息),然后由init进程接管。如果不及时回收僵尸进程,那么它在系统中就会占用一个进程表项,如果这种僵尸进程过多, 最后系统就没有可以用的进程表项,于是也无法再运行其它的程序。
预防僵尸进程有以下几种方法:
父 进程通过wait和waitpid等函数使其等待子进程结束,然后再执行父进程中的代码,这会导致父进程挂起。上面的代码就是使用这种方式实现的,但在 WEB环境下,它不适合子进程需要长时间运行的情况(会导致超时)。使用wait和waitpid方法使父进程自动回收其僵尸子进程(根据子进程的返回状 态),waitpid用于临控指定子进程,wait是对于所有子进程而言。
如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收
如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号,例如:pcntl_signal(SIGCHLD, SIG_IGN);
$pid = pcntl_fork();
//....code
还有一个技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程再fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。下面是一个例子:
在 fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进 程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为”孤儿进程”,过继给1号进程init,init会定期调用wait回收 清理这些父进程已退出的僵尸子进程。
所以,上面的示例可以改成:
怎样产生僵尸进程的
一 个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它 的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已 经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵 尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程 结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但 是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
任何一个子进程(init 除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的 阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是”Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。
如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
另外,还可以写一个php文件,然后在以后台形式来运行它,例如:
然后在insertLargeData.php文件中做数据库操作。也可以用cronjob + php的方式实现大数据量的处理。
如果是在终端运行php命令,当终端关闭后,刚刚执行的命令也会被强制关闭,如果你想让其不受终端关闭的影响,可以使用nohup命令实现:
[/codes]
//Action代码
public function createAction(){
//....
//将args替换成要传给insertLargeData.php的参数,参数间用空格间隔
system('nohup php -f insertLargeData.php ' . ' args ' . '&');
$this->redirect('/');
}
?>
[/codes]
你还可以使用screen命令代替nohup命令。
分别来自:
http://blog.zol.com.cn/2366/article_2365152.html
http://blog.zol.com.cn/2366/article_2365155.html
[常用调试]在Chrome浏览器进行JS运行与调试替换firefox调试js的简单运行窗口,新版的firefox地址栏无法执行javascript脚本用命令行shift+F4调出脚本编辑器的解决办法。
Php/Js/Shell/Go jackxiang 2013-6-14 15:10
在Chrome浏览器进行JS运行与调试:
Open the Snippets pane
The Snippets pane lists your snippets. To edit a snippet, open it in one of two ways:
Navigate to Sources > More tabs. More tabs > Snippets.
源代码->代码段->输入:
console.log('Hello, Snippets!');
document.body.innerHTML = '';
const p = document.createElement('p');
p.textContent = 'Hello, Snippets!';
document.body.appendChild(p);
mac按下:⌘+Enter
来自:https://developer.chrome.com/docs/devtools/javascript/snippets/?utm_source=devtools
背景:主要是想通过在FF浏览器的Url栏里输入这样的,看中文:javascript.alert("\u8428\u6587\u7389-\u96ea\u5c71\u4e4b\u604b");
昨天firefox自动将我的3.6版本升级为firefox12,升级完后发现firefox12速度比firefox3.6快了许多,感觉还不错的。但是今天发现在firefox12地址栏中输入javascript:alert(123)这种javascript脚本时,无法执行,打开firebug看发现尽然出错了:uncaught exception:referenceError:alert is not defined。
使用firefox3.6直接在地址栏输入javascript脚本都是可以执行的,升级了到firefox12就不行了?
网上查了一下,说是firefox7+版本以后不支持地址栏运行javascript脚本了,需要安装tab_utilities-1.1.5-fx.xpi扩展。+_+。。。
点击这里下载或者安装tab_utilities-1.1.5-fx.xpi扩展:http://www.coding123.net/download/20120824/firefox-tab-utilities-1.1.5-fx.xpi.aspx,
就可以在firefox7+版本以上的地址栏执行javascript脚本了。
当然还有第二个方法:
You can find that here: Firefox > Web Developer > Scratchpad (Shift+F4) .[这个最好打开一个新的窗口]
试了下果然可用,是这样的:调出那个框框后,直接输入(不再要javascript了):
alert("\u8428\u6587\u7389-\u96ea\u5c71\u4e4b\u604b");
按ctrl+r 就弹出框了,如下提示:
萨文玉-雪山之恋
来自:http://www.coding123.net/article/20120824/firefox-url-address-can-not-execute-javascript.aspx
http://support.mozilla.org/zh-CN/questions/895963
最后,如果一些接口输出中文,如UTF8是三个字节组成,看不清,用那个Shift+F4调出后,直接粘贴json串进里面去,点格式美化就能显示出中文了,不用在地址栏里输出javascript:alert("ssssXXXAAA");。
Open the Snippets pane
The Snippets pane lists your snippets. To edit a snippet, open it in one of two ways:
Navigate to Sources > More tabs. More tabs > Snippets.
源代码->代码段->输入:
console.log('Hello, Snippets!');
document.body.innerHTML = '';
const p = document.createElement('p');
p.textContent = 'Hello, Snippets!';
document.body.appendChild(p);
mac按下:⌘+Enter
来自:https://developer.chrome.com/docs/devtools/javascript/snippets/?utm_source=devtools
背景:主要是想通过在FF浏览器的Url栏里输入这样的,看中文:javascript.alert("\u8428\u6587\u7389-\u96ea\u5c71\u4e4b\u604b");
昨天firefox自动将我的3.6版本升级为firefox12,升级完后发现firefox12速度比firefox3.6快了许多,感觉还不错的。但是今天发现在firefox12地址栏中输入javascript:alert(123)这种javascript脚本时,无法执行,打开firebug看发现尽然出错了:uncaught exception:referenceError:alert is not defined。
使用firefox3.6直接在地址栏输入javascript脚本都是可以执行的,升级了到firefox12就不行了?
网上查了一下,说是firefox7+版本以后不支持地址栏运行javascript脚本了,需要安装tab_utilities-1.1.5-fx.xpi扩展。+_+。。。
点击这里下载或者安装tab_utilities-1.1.5-fx.xpi扩展:http://www.coding123.net/download/20120824/firefox-tab-utilities-1.1.5-fx.xpi.aspx,
就可以在firefox7+版本以上的地址栏执行javascript脚本了。
当然还有第二个方法:
You can find that here: Firefox > Web Developer > Scratchpad (Shift+F4) .[这个最好打开一个新的窗口]
试了下果然可用,是这样的:调出那个框框后,直接输入(不再要javascript了):
alert("\u8428\u6587\u7389-\u96ea\u5c71\u4e4b\u604b");
按ctrl+r 就弹出框了,如下提示:
萨文玉-雪山之恋
来自:http://www.coding123.net/article/20120824/firefox-url-address-can-not-execute-javascript.aspx
http://support.mozilla.org/zh-CN/questions/895963
最后,如果一些接口输出中文,如UTF8是三个字节组成,看不清,用那个Shift+F4调出后,直接粘贴json串进里面去,点格式美化就能显示出中文了,不用在地址栏里输出javascript:alert("ssssXXXAAA");。
[群里讨论]Nginx直接访问Memcache以利用Nginx的epoll性能,尽量不要透入到PHP的FastCGI里。
Php/Js/Shell/Go jackxiang 2013-6-14 09:52
问:php fpm 两周遭遇2次假死 求指点 fpm static 256个 另外开了8G的memcache
答:一般都是因为一个请求卡主了以后 这个cgi可能就卡着不动了 合理设置IO的timeout时间
问:IO的timeout时间?
答:就是读写mysql memcache等的过期时间
------
补充:
其实我觉得 如果你是nginx 的话
可以让nginx 直接读memcache 这样可以减轻 fpm 的压力
nginx + lua?淘宝那个 插件吧
恩 这样确实不错
看项目吧
我们这基本纯访问的 可以搞搞这种
有复杂逻辑的还是算了
而且有人说过 万一哪一时刻 memcache 命中率低了
fpm 会暴增 会形成多米洛效应
fpm 是静态的 固定的
答:一般都是因为一个请求卡主了以后 这个cgi可能就卡着不动了 合理设置IO的timeout时间
问:IO的timeout时间?
答:就是读写mysql memcache等的过期时间
------
补充:
其实我觉得 如果你是nginx 的话
可以让nginx 直接读memcache 这样可以减轻 fpm 的压力
nginx + lua?淘宝那个 插件吧
恩 这样确实不错
看项目吧
我们这基本纯访问的 可以搞搞这种
有复杂逻辑的还是算了
而且有人说过 万一哪一时刻 memcache 命中率低了
fpm 会暴增 会形成多米洛效应
fpm 是静态的 固定的
[很少遇到]How to catch curl errors in PHP,怎么捕获PHP里的Curl出现的超时发生的异常错误?
Php/Js/Shell/Go jackxiang 2013-6-13 09:31
背景:用try catch去捕获php的curl错误,是不行的,
The PHP cURL functions do not throw exceptions, so there will never be anything to catch. You'll just have to check the return value for a boolean false.
As to why the cURL timeout does not seem to be occurring after 30 seconds, I'm not sure.
上面代码返回:
error:Could not resolve host: 12122222.com; Host not found
打开注释代码返回:
Fatal error: Uncaught exception 'Exception' with message 'Curl Has Some Wrong ,Please Check It。' in D:\wamp\www\curl_try_catch.php on line 14
Exception: Curl Has Some Wrong ,Please Check It。 in D:\wamp\www\curl_try_catch.php on line 14
---
返回一些状态码,URl如下:curl.haxx.se/libcurl/c/libcurl-errors.html
再进行捕获。
来自:
http://stackoverflow.com/questions/3987006/how-to-catch-curl-errors-in-php
You can use the curl_error() function to know if there was some error, example:
if(curl_errno($c))
{
echo 'error:' . curl_error($c);
}
===================================================
I'm trying to debug this cURL-operation. The var_dump() is returning bool(false)
How can I make it exit the try in that case?
Why not try throwing an Exception when false is returned?
Look here: php.net/manual/en/function.curl-exec.php; basically, false means the operation failed.
Found it: echo curl_error($ch); "Couldn't connect to host"
http://stackoverflow.com/questions/7069822/curl-try-catch-problem
群讨论:
回忆未来-向东-Jàck(372647***) 上午 10:49:40
PHP try catch 能抓到Curl的timeout吗
一周工作五天(243801***) 上午 10:50:58
不能
回忆未来-向东-Jàck(372647***) 上午 10:52:15
常规处理办法是?
三德子(277940***) 上午 10:52:31
curl没有抛异常 除非你去做个errorhandler
回忆未来-向东-Jàck(372647***) 上午 10:52:39
前一段时间我写过博文,但没有根治:http://www.jackxiang.com/post/6445/
errorhandler ?
有示例demo么。
三德子(277940***) 上午 10:53:02
在errorhandler中 抛errorexception
看手册 errorexception这一章
回忆未来-向东-Jàck(372647***) 上午 10:53:48
嗯,超时捕获有code值没?
三德子(277940***) 上午 10:53:57
一周工作五天(243801***) 上午 10:55:41
搞那么复杂干嘛 直接把 超时时间设置长些不就ok了
----------------------------------------------------------------------------------------------
强制用try catch作下实践如下:
访问:http://jackxiang.com/test/testTimeOut
Max Time Out...time out。
Error fetching remote http://jackxiang.com/test/testMaxTimeUrl [ status 0 ]
Error fetching remote http://jackxiang.com/test/testMaxTimeUrl [ status 0 ]
Operation timed out after 5007 milliseconds with 0 bytes received
其实上述说明,不在curl里捕获,在外面一层也是能捕捉到的,只是错误的message提示是:Error:Operation timed out after 5007 milliseconds with 0 bytes received!
________________________________________________________________________________________________
在生产中的代码,用try catch实现的Remote:get,来自KO框架,作了下简单修改(有时Url为空,不知是谁调的,Add Time:2014/03/26):
The PHP cURL functions do not throw exceptions, so there will never be anything to catch. You'll just have to check the return value for a boolean false.
As to why the cURL timeout does not seem to be occurring after 30 seconds, I'm not sure.
上面代码返回:
error:Could not resolve host: 12122222.com; Host not found
打开注释代码返回:
Fatal error: Uncaught exception 'Exception' with message 'Curl Has Some Wrong ,Please Check It。' in D:\wamp\www\curl_try_catch.php on line 14
Exception: Curl Has Some Wrong ,Please Check It。 in D:\wamp\www\curl_try_catch.php on line 14
---
返回一些状态码,URl如下:curl.haxx.se/libcurl/c/libcurl-errors.html
再进行捕获。
来自:
http://stackoverflow.com/questions/3987006/how-to-catch-curl-errors-in-php
You can use the curl_error() function to know if there was some error, example:
if(curl_errno($c))
{
echo 'error:' . curl_error($c);
}
===================================================
I'm trying to debug this cURL-operation. The var_dump() is returning bool(false)
How can I make it exit the try in that case?
Why not try throwing an Exception when false is returned?
Look here: php.net/manual/en/function.curl-exec.php; basically, false means the operation failed.
Found it: echo curl_error($ch); "Couldn't connect to host"
http://stackoverflow.com/questions/7069822/curl-try-catch-problem
群讨论:
回忆未来-向东-Jàck(372647***) 上午 10:49:40
PHP try catch 能抓到Curl的timeout吗
一周工作五天(243801***) 上午 10:50:58
不能
回忆未来-向东-Jàck(372647***) 上午 10:52:15
常规处理办法是?
三德子(277940***) 上午 10:52:31
curl没有抛异常 除非你去做个errorhandler
回忆未来-向东-Jàck(372647***) 上午 10:52:39
前一段时间我写过博文,但没有根治:http://www.jackxiang.com/post/6445/
errorhandler ?
有示例demo么。
三德子(277940***) 上午 10:53:02
在errorhandler中 抛errorexception
看手册 errorexception这一章
回忆未来-向东-Jàck(372647***) 上午 10:53:48
嗯,超时捕获有code值没?
三德子(277940***) 上午 10:53:57
一周工作五天(243801***) 上午 10:55:41
搞那么复杂干嘛 直接把 超时时间设置长些不就ok了
----------------------------------------------------------------------------------------------
强制用try catch作下实践如下:
访问:http://jackxiang.com/test/testTimeOut
Max Time Out...time out。
Error fetching remote http://jackxiang.com/test/testMaxTimeUrl [ status 0 ]
Error fetching remote http://jackxiang.com/test/testMaxTimeUrl [ status 0 ]
Operation timed out after 5007 milliseconds with 0 bytes received
其实上述说明,不在curl里捕获,在外面一层也是能捕捉到的,只是错误的message提示是:Error:Operation timed out after 5007 milliseconds with 0 bytes received!
________________________________________________________________________________________________
在生产中的代码,用try catch实现的Remote:get,来自KO框架,作了下简单修改(有时Url为空,不知是谁调的,Add Time:2014/03/26):
POST的原始数据获得方法
Php/Js/Shell/Go jackxiang 2013-6-11 19:44
[实践OK]相当有用之频率测试 curl 时间 CURL一行时间参数/curl获取网络时间访问多次测试网页响应时间的shell脚本,需要Curl支持,Curl测试访问时间,DNS解析时间。
Php/Js/Shell/Go jackxiang 2013-6-6 12:02
背景:一天突然发现访问网站特别的慢,怎么办?原因是啥,不知道,此时,祭出CURL,加上相关的数据输出,特别是对于DNS慢这种问题最难查,居然被我碰到了,time_namelookup 这个参数很重要,DNS解析时间,从请求开始到DNS解析完毕所用时间(记得关掉 Linux 的 nscd 的服务测试),当然,查dns更为直观的是用curl的-H参数(http://jackxiang.com/post/4423/),不用dns解析时的一个指标,再就是用dns解析的一个指标,一对比就出来了,该命令在windows下使用也没问题。
DNS解析时的时间:
5.011:5.011:5.020:5.020:
不用DNS相当于写死Host解析时的办法:
0.003:0.003:0.026:0.026
time_namelookup时间5.011太长了,说明DNS有问题,一查果然有问题,由于此内网DNS解析了单位办工机器,还解析线上服务器内部域名,压力太大导致,为此,新加了一台dns服务器,减轻压力,解析的速度上去了,也就好了。
相关参数解释:
time_connect 建立到服务器的 TCP 连接所用的时间
time_starttransfer 在发出请求之后,Web 服务器返回数据的第一个字节所用的时间
time_total 完成请求所用的时间
time_namelookup DNS解析时间,从请求开始到DNS解析完毕所用时间(记得关掉 Linux 的 nscd 的服务测试)
speed_download 下载速度,单位-字节每秒。(注意它是字节)
[/codes]
来个实例:
加上字节:
time函数实现时间:
加上Shell的for循环,一般主要是打印时间:
粘贴好像会报错,直接给个DownLoad:
sh curlExecuteTime.sh -n 12 "http://localhost"
**春(**春) 11:11:56
time_connect: 0.001
time_namelookup: 0
time_total: 0.01419
**春(**春) 11:12:18
这个结果按说是没问题的吧
向东(向东) 11:12:34
没问题,你要想获取接口返回修改下这儿:curl -o /dev/null -s -w \
向东(向东) 11:12:42
它定向到null了。
向东(向东) 11:21:16
c=`curl -o /tmp/$i.txt -s -w \
这样就可以在tmp下生成1.txt 2.txt了,呵呵。
DownLoad:
零:可以直接用shell实现,用vim列模式/行模式进行批量输入,当然也可以用shell的for循环,如出现301错误需要输出头-i,如下:
一:PHP下的Curl获取时间 :
二:Shell下的curl原理:
curl -o /dev/null -s -w '连接时间:%{time_connect},传输时间:%{time_starttransfer}:%{time_total}' "http://jackxiang.com"
POST示例(不用-o写入文件,直接看):
用法及返回结果如下:
lvyaozu@lvyaozu-desktop:~/shell$ ./requesturl.sh -n20 http://www.baidu.com
Request url: http://www.baidu.com
Request number: 20
Request Failed: 0
——Average Value——
time_connect: 0.1614
time_total: 0.1693
time_namelookup: 0.0088
————————-
请求参数:
-n 指定发送多少次请求,默认为10
返回结果为 curl -w 选项返回值,以下摘自curl官方文档:
http://curl.haxx.se/docs/manpage.html
time_connect The time, in seconds, it took from the start until the TCP connect to the remote host (or proxy) was completed.
time_total The total time, in seconds, that the full operation lasted. The time will be displayed with millisecond resolution.
time_namelookup The time, in seconds, it took from the start until the name resolving was completed.
代码如下:
我的实践如下:
sh curlExecuteTime.sh -n 12 "http://jackxiang.com/getAlbumsByUId?appkey=100&userid=21240168&sortby=hot"
Request url: hhttp://jackxiang.com/getAlbumsByUId?appkey=100&userid=21240168&sortby=hot
Request number: 12
Request Failed: 0
------Average Value------
time_connect: 0.001
time_namelookup: 0.001
time_total: 0.0760833
-------------------------
来自:http://renxiangzyq.iteye.com/blog/782773
1、开启gzip请求
curl -I http://www.sina.com.cn/ -H Accept-Encoding:gzip,defalte
2、监控网页的响应时间
curl -o /dev/null -s -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" "http://www.kklinux.com"
3. 监控站点可用性
curl -o /dev/null -s -w %{http_code} "http://www.kklinux.com"
4、以http1.0协议请求(默认为http1.1)
curl -0 ..............
监控站点首页下载时间:
curl -o /dev/null -s -w ‘%{time_total}’ http://www.miotour.com
curl -o /dev/null -s -w ‘%{http_code}’ http://www.miotour.com
curl -o /dev/null -s -w %{http_code}:%{time_connect}:%{time_starttransfer}:%{time_total} http://www.miotour.com
结果:2.547
-s 静默输出;没有-s的话就是下面的情况,这是在脚本等情况下不需要的信息。
[ec2-user@ip-10-122-250-19 ~]$ curl -o /dev/null -w ‘%{time_total}’ http://www.miotour.com
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 67770 0 67770 0 0 19228 0 –:–:– 0:00:03 –:–:– 20705
结果:3.524
监控首页各项时间指标:
curl -o /dev/null -s -w ‘%{time_connect}:%{time_starttransfer}:%{time_total}’ http://www.miotour.com
结果: 0.244: 1.044: 2.672
时间指标解释 :
time_connect 建立到服务器的 TCP 连接所用的时间
time_starttransfer 在发出请求之后,Web 服务器返回数据的第一个字节所用的时间
time_total 完成请求所用的时间
在 发出请求之后,Web 服务器处理请求并开始发回数据所用的时间是
(time_starttransfer)1.044 - (time_connect)0.244 = 0.8 秒
客户机从服务器下载数据所用的时间是
(time_total)2.672 - (time_starttransfer)1.044 = 1.682 秒
指定特定主机IP地址访问网站
curl -x 61.135.169.105:80 http://www.baidu.com
curl -x 61.135.169.125:80 http://www.baidu.com
摘录来自:http://blog.163.com/dingding_jacky/blog/static/166912787201242440274/
DNS解析时的时间:
5.011:5.011:5.020:5.020:
不用DNS相当于写死Host解析时的办法:
0.003:0.003:0.026:0.026
time_namelookup时间5.011太长了,说明DNS有问题,一查果然有问题,由于此内网DNS解析了单位办工机器,还解析线上服务器内部域名,压力太大导致,为此,新加了一台dns服务器,减轻压力,解析的速度上去了,也就好了。
相关参数解释:
time_connect 建立到服务器的 TCP 连接所用的时间
time_starttransfer 在发出请求之后,Web 服务器返回数据的第一个字节所用的时间
time_total 完成请求所用的时间
time_namelookup DNS解析时间,从请求开始到DNS解析完毕所用时间(记得关掉 Linux 的 nscd 的服务测试)
speed_download 下载速度,单位-字节每秒。(注意它是字节)
[/codes]
来个实例:
加上字节:
time函数实现时间:
加上Shell的for循环,一般主要是打印时间:
粘贴好像会报错,直接给个DownLoad:
下载文件
sh curlExecuteTime.sh -n 12 "http://localhost"
**春(**春) 11:11:56
time_connect: 0.001
time_namelookup: 0
time_total: 0.01419
**春(**春) 11:12:18
这个结果按说是没问题的吧
向东(向东) 11:12:34
没问题,你要想获取接口返回修改下这儿:curl -o /dev/null -s -w \
向东(向东) 11:12:42
它定向到null了。
向东(向东) 11:21:16
c=`curl -o /tmp/$i.txt -s -w \
这样就可以在tmp下生成1.txt 2.txt了,呵呵。
DownLoad:
下载文件
零:可以直接用shell实现,用vim列模式/行模式进行批量输入,当然也可以用shell的for循环,如出现301错误需要输出头-i,如下:
一:PHP下的Curl获取时间 :
二:Shell下的curl原理:
curl -o /dev/null -s -w '连接时间:%{time_connect},传输时间:%{time_starttransfer}:%{time_total}' "http://jackxiang.com"
POST示例(不用-o写入文件,直接看):
用法及返回结果如下:
lvyaozu@lvyaozu-desktop:~/shell$ ./requesturl.sh -n20 http://www.baidu.com
Request url: http://www.baidu.com
Request number: 20
Request Failed: 0
——Average Value——
time_connect: 0.1614
time_total: 0.1693
time_namelookup: 0.0088
————————-
请求参数:
-n 指定发送多少次请求,默认为10
返回结果为 curl -w 选项返回值,以下摘自curl官方文档:
http://curl.haxx.se/docs/manpage.html
time_connect The time, in seconds, it took from the start until the TCP connect to the remote host (or proxy) was completed.
time_total The total time, in seconds, that the full operation lasted. The time will be displayed with millisecond resolution.
time_namelookup The time, in seconds, it took from the start until the name resolving was completed.
代码如下:
我的实践如下:
sh curlExecuteTime.sh -n 12 "http://jackxiang.com/getAlbumsByUId?appkey=100&userid=21240168&sortby=hot"
Request url: hhttp://jackxiang.com/getAlbumsByUId?appkey=100&userid=21240168&sortby=hot
Request number: 12
Request Failed: 0
------Average Value------
time_connect: 0.001
time_namelookup: 0.001
time_total: 0.0760833
-------------------------
来自:http://renxiangzyq.iteye.com/blog/782773
1、开启gzip请求
curl -I http://www.sina.com.cn/ -H Accept-Encoding:gzip,defalte
2、监控网页的响应时间
curl -o /dev/null -s -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" "http://www.kklinux.com"
3. 监控站点可用性
curl -o /dev/null -s -w %{http_code} "http://www.kklinux.com"
4、以http1.0协议请求(默认为http1.1)
curl -0 ..............
监控站点首页下载时间:
curl -o /dev/null -s -w ‘%{time_total}’ http://www.miotour.com
curl -o /dev/null -s -w ‘%{http_code}’ http://www.miotour.com
curl -o /dev/null -s -w %{http_code}:%{time_connect}:%{time_starttransfer}:%{time_total} http://www.miotour.com
结果:2.547
-s 静默输出;没有-s的话就是下面的情况,这是在脚本等情况下不需要的信息。
[ec2-user@ip-10-122-250-19 ~]$ curl -o /dev/null -w ‘%{time_total}’ http://www.miotour.com
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 67770 0 67770 0 0 19228 0 –:–:– 0:00:03 –:–:– 20705
结果:3.524
监控首页各项时间指标:
curl -o /dev/null -s -w ‘%{time_connect}:%{time_starttransfer}:%{time_total}’ http://www.miotour.com
结果: 0.244: 1.044: 2.672
时间指标解释 :
time_connect 建立到服务器的 TCP 连接所用的时间
time_starttransfer 在发出请求之后,Web 服务器返回数据的第一个字节所用的时间
time_total 完成请求所用的时间
在 发出请求之后,Web 服务器处理请求并开始发回数据所用的时间是
(time_starttransfer)1.044 - (time_connect)0.244 = 0.8 秒
客户机从服务器下载数据所用的时间是
(time_total)2.672 - (time_starttransfer)1.044 = 1.682 秒
指定特定主机IP地址访问网站
curl -x 61.135.169.105:80 http://www.baidu.com
curl -x 61.135.169.125:80 http://www.baidu.com
摘录来自:http://blog.163.com/dingding_jacky/blog/static/166912787201242440274/
[接口超时]在Nginx里的PHP输出接口进行strace时发现的超时问题备案,有可能是Mysql Server里域名解析导致。
Php/Js/Shell/Go jackxiang 2013-6-5 18:17
Nginx里有一个PHP的接口,发现是PHP的超时,于是经过strace时发现:
经过xdebug发现它是由于数据库访问这个函数超时引起的,有5秒到15秒之多,但是把这个SQL贴在终端里访问,发现它很快才几毫秒。
用下面的sleep代码也能形成TimeOut,如下:
我在想,是192.168.109.8访问192.168.109.7上中间有时会有波动造成的,还是因为PHP连接时超时呢?需要进一步了解啊。
有一个域名反解的配置把这个去掉:
skip-name-resolve
修改配置文件添加并需要重启:
修改my.cnf的配置文件添加并需要重启,试试:
[mysqld]
skip-name-resolve
感觉通过一个脚本访问好像好了,需要时间验证,脚本:
http://www.jackxiang.com/post/6421/
经过xdebug发现它是由于数据库访问这个函数超时引起的,有5秒到15秒之多,但是把这个SQL贴在终端里访问,发现它很快才几毫秒。
用下面的sleep代码也能形成TimeOut,如下:
我在想,是192.168.109.8访问192.168.109.7上中间有时会有波动造成的,还是因为PHP连接时超时呢?需要进一步了解啊。
有一个域名反解的配置把这个去掉:
skip-name-resolve
修改配置文件添加并需要重启:
修改my.cnf的配置文件添加并需要重启,试试:
[mysqld]
skip-name-resolve
感觉通过一个脚本访问好像好了,需要时间验证,脚本:
http://www.jackxiang.com/post/6421/
nginx里的keepalive-timeout选项
此选项说的是可使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,keepalive-timeout功能可避免建立或重新建立连接。
涉及的选项还有stub_status on,能看到waiting值也和keepalive-timeout设置有关
nginx不像apache,直接有指令keep-alive off/on;它使用的是keepalive_timeout [time],默认的时长为75,可以在http、server、location使用此指令。
在本机进行的模拟测试:
nginx.conf
keepalive_timeout 600;
curl -i Url //i 显示Http头
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 05 Jun 2013 07:57:06 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: no-cache
Pragma: no-cache
nginx.conf指定的VHOST中添加了规则:
location /gtj/ {
alias C:/phpApp/gtj/;
keepalive_timeout 0;
expires 5m;
}
客户端请求后,可以用httpwatch抓取返回的头部信息:
Http头:
connection close
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 05 Jun 2013 07:59:40 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Cache-Control: no-cache
Pragma: no-cache
阅读全文
此选项说的是可使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,keepalive-timeout功能可避免建立或重新建立连接。
涉及的选项还有stub_status on,能看到waiting值也和keepalive-timeout设置有关
nginx不像apache,直接有指令keep-alive off/on;它使用的是keepalive_timeout [time],默认的时长为75,可以在http、server、location使用此指令。
在本机进行的模拟测试:
nginx.conf
keepalive_timeout 600;
curl -i Url //i 显示Http头
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 05 Jun 2013 07:57:06 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: no-cache
Pragma: no-cache
nginx.conf指定的VHOST中添加了规则:
location /gtj/ {
alias C:/phpApp/gtj/;
keepalive_timeout 0;
expires 5m;
}
客户端请求后,可以用httpwatch抓取返回的头部信息:
Http头:
connection close
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 05 Jun 2013 07:59:40 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Cache-Control: no-cache
Pragma: no-cache
阅读全文
[tab设置]更改Zend Studio/Eclipse的制表Tab缩进为4个空格缩进,荐用空格取代tab,一般取4个空格,这样代码就美观多了。
Php/Js/Shell/Go jackxiang 2013-5-28 10:29
背景:缩进使用4个空格,而不是 tab。这是PHP编程规范手册中的一句话。
今天重装了一下Zend Studio,在编码时发现回车缩进是tab制表符,颇为不爽,记得很久很久以前哥写代码是不缩进的,后来经老师提醒,改用tab缩进,一直这样编码了很长时间。后来看到一篇介绍代码格式的文章才知道各类文本编辑器对于tab制表符的长度规定不一样,这就导致同样缩进的代码在不同系统或者编辑器上缩进长短不一,影响代码风格的一致性。所以推荐用空格取代tab,一般取4个空格,这样代码就美观多了。
实践Ok如下:
在编辑器里,窗口->首选项->PHP->code style->formatter->Edit->Indentation->General settings Tab size: 4.
参考来自:http://wangye.org/blog/archives/541/
==========================================================================================
editplus中tab转换为空格:
缩进使用4个空格,而不是 tab。这是PHP编程规范手册中的一句话。
之所以这样,是因为tab在不同的编辑器代表的空格是不一样的,为了排版不出现混乱,规范中建议直接使用空格。
但是直接用空格的话,我们在写代码的时候经常会需要缩进,不用TAB的话工作量是巨大的。
其实,我们完全可以用EditPlus解决这个问题。
写代码的时候放心去用TAB,写完代码后,用鼠标选择全部代码,右击->format(格式)->tabs to spaces(制表符转为空格),这样就可以把所有的tab改为spaces了。
实践Ok如下:
右键,格式,制表符转为空格。
来自:http://hi.baidu.com/amenmen/item/e7c9588eca8f48d65f0ec120
=========================================================================================
Notepad++
设置->首选项->语言->右下角,以空格取代打勾。
来自:http://bbs.phpchina.com/thread-220762-1-1.html
=========================================================================================
在.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:
set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格)
set expandtab
对于已保存的文件,可以使用下面的方法进行空格和TAB的替换:
TAB替换为空格:
:set ts=4
:set expandtab
:%retab!
空格替换为TAB:
:set ts=4
:set noexpandtab
:%retab!
加!是用于处理非空白字符之后的TAB,即所有的TAB,若不加!,则只处理行首的TAB。
在.vimrc文件中输入如下文本:
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
set nu
set autoindent
set cindent
其中:Tabstop:表示一个 tab 显示出来是多少个空格的长度,默认 8。
Softtabstop:表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。
Shiftwidth:表示每一级缩进的长度,一般设置成跟 softtabstop 一样。 当设置成 expandtab 时,缩进用空格来表示noexpandtab 则是用制表符表示一个缩进。
Nu:表示显示行号。
Autoindent:表示自动缩进。
Cindent:是特别针对C语言自动缩进。
来自:http://blog.163.com/panda_sha/blog/static/478281962011616124316/
==========================================================================================
在eclipse中设置tab的长度:
在eclipse中设置tab size的地方有多个
1:window——preference——General——Editor——Text Editor设置页面:Display Tab Width
2:window——preference——Java——Code Style——Formatter设置页面,Edit,在弹出的Editor profile窗口中,Indentation卡片,设置Indentation Size和Tab Size。
3:如果安装了Myeclipse,那么在window——preference——Myeclipse——Editor——Common Editor Preference中Apperance卡片,设置Tab Size。
来自:http://taoistwar.iteye.com/blog/369956
今天重装了一下Zend Studio,在编码时发现回车缩进是tab制表符,颇为不爽,记得很久很久以前哥写代码是不缩进的,后来经老师提醒,改用tab缩进,一直这样编码了很长时间。后来看到一篇介绍代码格式的文章才知道各类文本编辑器对于tab制表符的长度规定不一样,这就导致同样缩进的代码在不同系统或者编辑器上缩进长短不一,影响代码风格的一致性。所以推荐用空格取代tab,一般取4个空格,这样代码就美观多了。
实践Ok如下:
在编辑器里,窗口->首选项->PHP->code style->formatter->Edit->Indentation->General settings Tab size: 4.
参考来自:http://wangye.org/blog/archives/541/
==========================================================================================
editplus中tab转换为空格:
缩进使用4个空格,而不是 tab。这是PHP编程规范手册中的一句话。
之所以这样,是因为tab在不同的编辑器代表的空格是不一样的,为了排版不出现混乱,规范中建议直接使用空格。
但是直接用空格的话,我们在写代码的时候经常会需要缩进,不用TAB的话工作量是巨大的。
其实,我们完全可以用EditPlus解决这个问题。
写代码的时候放心去用TAB,写完代码后,用鼠标选择全部代码,右击->format(格式)->tabs to spaces(制表符转为空格),这样就可以把所有的tab改为spaces了。
实践Ok如下:
右键,格式,制表符转为空格。
来自:http://hi.baidu.com/amenmen/item/e7c9588eca8f48d65f0ec120
=========================================================================================
Notepad++
设置->首选项->语言->右下角,以空格取代打勾。
来自:http://bbs.phpchina.com/thread-220762-1-1.html
=========================================================================================
在.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:
set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格)
set expandtab
对于已保存的文件,可以使用下面的方法进行空格和TAB的替换:
TAB替换为空格:
:set ts=4
:set expandtab
:%retab!
空格替换为TAB:
:set ts=4
:set noexpandtab
:%retab!
加!是用于处理非空白字符之后的TAB,即所有的TAB,若不加!,则只处理行首的TAB。
在.vimrc文件中输入如下文本:
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
set nu
set autoindent
set cindent
其中:Tabstop:表示一个 tab 显示出来是多少个空格的长度,默认 8。
Softtabstop:表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。
Shiftwidth:表示每一级缩进的长度,一般设置成跟 softtabstop 一样。 当设置成 expandtab 时,缩进用空格来表示noexpandtab 则是用制表符表示一个缩进。
Nu:表示显示行号。
Autoindent:表示自动缩进。
Cindent:是特别针对C语言自动缩进。
来自:http://blog.163.com/panda_sha/blog/static/478281962011616124316/
==========================================================================================
在eclipse中设置tab的长度:
在eclipse中设置tab size的地方有多个
1:window——preference——General——Editor——Text Editor设置页面:Display Tab Width
2:window——preference——Java——Code Style——Formatter设置页面,Edit,在弹出的Editor profile窗口中,Indentation卡片,设置Indentation Size和Tab Size。
3:如果安装了Myeclipse,那么在window——preference——Myeclipse——Editor——Common Editor Preference中Apperance卡片,设置Tab Size。
来自:http://taoistwar.iteye.com/blog/369956
PHP的pthreads扩展:真正的PHP多线程(绝非fork或者用http再开进程)。
Php/Js/Shell/Go jackxiang 2013-5-23 09:50
背景:很多PHPer想PHP也像Java / c++ 一样能支持多线程,于是就有了,在新的版本里加了这样一个扩展,之所以它能行,因为Linux本身就支持,用C扩展一下就可以了,这样用到底成熟不,还是值得时间和对这种应用的需求程度进行检验。
扩展地址:
http://pecl.php.net/package/pthreads
阅读全文
扩展地址:
http://pecl.php.net/package/pthreads
阅读全文
利用PHP操作Linux消息队列完成进程间通信这qnum最大长度修改。
Php/Js/Shell/Go jackxiang 2013-5-22 10:37
膘叔(19129***) 上午 09:51:54
求科谱:msg_stat_queue中,那个qnum最大只有40,也就是我同时只能最大处理40个队列,能不能再大一点?
维尼熊(380139***) 上午 09:53:19
可以
膘叔(19129***) 上午 09:53:37
怎么调整?
维尼熊(380139***) 上午 09:53:52
/proc/sys/fs/mqueue/msg_max
[root@test ~]# cat /proc/sys/fs/mqueue/msg_max
10
阅读全文
求科谱:msg_stat_queue中,那个qnum最大只有40,也就是我同时只能最大处理40个队列,能不能再大一点?
维尼熊(380139***) 上午 09:53:19
可以
膘叔(19129***) 上午 09:53:37
怎么调整?
维尼熊(380139***) 上午 09:53:52
/proc/sys/fs/mqueue/msg_max
[root@test ~]# cat /proc/sys/fs/mqueue/msg_max
10
阅读全文