php怎么写定时职责?php如何定时执行义务

   图片 1

翻开代码

 
 断点设置完后,当程序运行到断点处就会中断。暂停的时候,大家可以查阅断点附近的代码。查看代码的子命令是list,缩写方式为l。突显的代码行数为10行,基本上以断点处为主导,向上向下各显示几行代码。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#gdb /usr/bin/php
(gdb) set  args ./test.php
(gdb) b basic_functions.c:zif_sleep
Breakpoint 6 at 0x624740: file /home/php-5.5.15/ext/standard/basic_functions.c, line 4439.
(gdb) r
Starting program: /home/fpm-php5.5.15/bin/php ./test.php
hello
0
Breakpoint 1, zif_sleep (ht=1, return_value=0x7ffff425a398, return_value_ptr=0x0, this_ptr=0x0, return_value_used=0)
    at /home/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
4439    {
(gdb)l
4434    /* }}} */
4435   
4436    /* {{{ proto void sleep(int seconds)
4437       Delay for a given number of seconds */
4438    PHP_FUNCTION(sleep)
4439    {
4440        long num;
4441   
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
4443            RETURN_FALSE;

   其它,你可以可以由此点名行号只怕措施名来查阅相关代码。

   指定行号查看代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
......
(gdb) list 4442
4437       Delay for a given number of seconds */
4438    PHP_FUNCTION(sleep)
4439    {
4440        long num;
4441   
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
4443            RETURN_FALSE;
4444        }
4445        if (num < 0) {
4446            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of seconds must be greater than or equal to 0");
......

   指定方法名查看代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
......
(gdb) list zif_sleep
4434    /* }}} */
4435   
4436    /* {{{ proto void sleep(int seconds)
4437       Delay for a given number of seconds */
4438    PHP_FUNCTION(sleep)
4439    {
4440        long num;
4441   
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
4443            RETURN_FALSE;
......

那个D:\php\cli\php.exe是我的PHP安装文件所在目录。Php.exe就是windows PHP命令行格局的主次。

<?php
    $cmd = ‘php PATH_TO_SUB1/sub1.php >/dev/null  &’;
    exec($cmd);
    $cmd = ‘php PATH_TO_SUB1/sub2.php >/dev/null  &’;
    exec($cmd);
?>

图片 2

透过rpm包格局安装

 
 从

1
#rpm -ivh ./gdb-7.8.1.rpm

下一场写一个windows批处理公事内容如下。

在Web环境下,执行php脚本都是Web服务器开启的cgi进度来处理,只要脚本不脱离,就会直接占有该cgi进程,当启动的持有cgi进度都被占用完后就无法在处理新的呼吁。所以对那个或许会很费劲的台本,可以应用异步的办法。启动子脚本的办法和CLI差不离,必必要使用&和指定输出(只能是定向到/dev/null),可是不可以使用nohup。例如:

gdb -p 56571

安装

 
 在设置gdb在此之前,先确定你的linux操作系统是还是不是安装了gdb。你可以选拔如下命令来规定是否安装了gdb。

1
#gdb -help

 
 假使已经设置了gdb,那么将会显得它能选拔的所有参数。假使没有设置,我们得以因此以下三种方法来安装。

三、解决方式:

//main.php
<?php
    $cmd = ‘nohup php ./sub.php >./tmp.log  &’;
    exec($cmd);
    $cmd = ‘nohup php ./sub1.php >/dev/null  &’;
    exec($cmd);
?>

 这么些时候就精通了是在test.php的11行 sleep函数导致的长河sleep。

常用作用介绍

 
 网上的一些科目基本上都以介绍使用gdb调试c可能c++语言编写的主次的。大家这节主要表达什么运用gdb调试php程序。大家的php脚本如下:

   文件名为test.php,代码如下:

1
2
3
4
5
6
<?php
echo "hello \n";
for($i = 0; $i < 10; $i++){    
    echo $i."\n";    
    sleep(10); }
?>

ignore_user_abort(true),那个函数的效果是,无论客户端是还是不是关闭浏览器,下边的代码都将赢得推行。

 

source /usr/local/src/php-7.2.9/.gdbinit
zbacktrace 

单步执行

 
 断点附近的代码你了解后,那时候你就足以应用单步执行一条一条语句的去实施。可以每一日查看执行后的结果。单步执行有五个指令,分别是step和next。这多个指令的差异在于:

   step 一条语句一条语句的实施。它有一个别名,s。

   next
和step类似。只是当遭受被调用的措施时,不会跻身到被调用方法中一条一条语句执行。它有一个别名n。

   可能您对那四个指令还有些迷惑。上边我们用八个例证来给您演示下。

   step命令示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#gdb /usr/bin/php
(gdb) set  args ./test.php
(gdb) b basic_functions.c:zif_sleep
Breakpoint 6 at 0x624740: file /home/php-5.5.15/ext/standard/basic_functions.c, line 4439.
(gdb) r
Starting program: /home/fpm-php5.5.15/bin/php ./test.php
hello
0
Breakpoint 1, zif_sleep (ht=1, return_value=0x7ffff425a398, return_value_ptr=0x0, this_ptr=0x0, return_value_used=0)
    at /home/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
4439    {
.......
(gdb) s
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
(gdb) s
zend_parse_parameters (num_args=1, type_spec=0x81fc41 "l") at /home/admin/php_src/php-5.5.15/Zend/zend_API.c:917
917 {

 
 可见,step命令进入到了被调用函数中zend_parse_parameters。使用step命令也会在那些艺术中一行一行的单步执行。

   next命令示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#gdb /usr/bin/php
(gdb) set  args ./test.php
(gdb) b basic_functions.c:zif_sleep
Breakpoint 6 at 0x624740: file /home/php-5.5.15/ext/standard/basic_functions.c, line 4439.
(gdb) r
Starting program: /home/fpm-php5.5.15/bin/php ./test.php
hello
0
Breakpoint 1, zif_sleep (ht=1, return_value=0x7ffff425a398, return_value_ptr=0x0, this_ptr=0x0, return_value_used=0)
    at /home/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
4439    {
.......
(gdb) n
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
(gdb) n
4445        if (num < 0) {

   可见,使用next命令只会在本方法中单步执行。

<?php
ignore_user_abort(true);set_time_limit(0);functionwrite_txt()
{if(!file_exists(”test.txt”)){$fp=fopen(”test.txt”,”wb”);fclose($fp);}$str=file_get_contents(’test.txt’);$str.=
“\r\n”.date(”H:i:s”);$fp=fopen(”test.txt”,”wb”);fwrite($fp,$str);fclose($fp);}functiondo_cron(){usleep(20000000);write_txt();}while(1){do_cron();}

CLI环境和Web环境进行的操作还不太一样。先来说CLI环境,这里需求用上nohup和&,同时还要把指定输出,假如不想要输出结果,可以把出口定向到/dev/null中。以后来做一个测试,假使在一个目录中有main.php、sub1.php和sub2.php,其中sub1和sub2内容一致都让sleep函数暂停一段时间。代码如下:

首先随便写一个测试脚本test.php,里面就写一个sleep函数,换成死循环也足以。

其他有效的指令

   backtrace 简写格局为bt。查看程序执行的库房新闻。

   finish  执行到眼下函数的截至

 

 

 命令  解释  示例
file <文件名> 加载被调试的可执行程序文件。
因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。
(gdb) file gdb-sample
r Run的简写,运行被调试的程序。
如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。
(gdb) r
c Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。 (gdb) c
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址>

d [编号]

b: Breakpoint的简写,设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。
其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。

d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。

(gdb) b 8
(gdb) b main
(gdb) b *main
(gdb) b *0x804835c

(gdb) d

s, n s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
n: 执行一行源程序代码,此行代码中的函数调用也一并执行。

s 相当于其它调试器中的“Step Into (单步跟踪进入)”;
n 相当于其它调试器中的“Step Over (单步跟踪)”。

这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。

(gdb) s
(gdb) n
si, ni si命令类似于s命令,ni命令类似于n命令。所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。 (gdb) si
(gdb) ni
p <变量名称> Print的简写,显示指定变量(临时变量或全局变量)的值。 (gdb) p i
(gdb) p nGlobalVar
display …

undisplay <编号>

display,设置程序中断后欲显示的数据及其格式。
例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
“display /i $pc”
其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。

undispaly,取消先前的display设置,编号从1开始递增。

(gdb) display /i $pc

(gdb) undisplay 1

i Info的简写,用于显示各类信息,详情请查阅“help i”。 (gdb) i r
q Quit的简写,退出GDB调试环境。 (gdb) q
help [命令名称] GDB帮助命令,提供对GDB名种命令的解释说明。
如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。
(gdb) help display

 

PHP的贯彻控制了它并未Java和.Net那种AppServer的定义,
而http研究是一个无状态的商议, php只可以被用户触发, 被调用,
调用后会自动退出内存, 没有常驻内存, 就没有艺术准确的定时处理那么,
即便需求用PHP定时进行某些职责以来, 可以有以下俩个法子:

 代码如下

发表评论

电子邮件地址不会被公开。 必填项已用*标注