PHP脚本可以启动另一个PHP脚本和退出?(Can a PHP script start anoth

2019-08-07 22:57发布

PHP脚本如何可以启动另一个PHP脚本,然后退出,让其它的脚本来运行?

此外,有没有什么办法了,当它达到一个特定的行第二个脚本通知PHP脚本?

Answer 1:

以下是如何做到这一点。 你告诉浏览器输出的第N个字符阅读,然后关闭连接,而你的脚本保持运行,直到它完成。

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
include('other_script.php');

echo('Text user will never see');
?>


Answer 2:

您可以通过有效地达到这个分叉 ,然后调用includerequire

parent.php:

<?php

    $pid = pcntl_fork();
    if ($pid == -1) {
        die("couldn't fork");
    } else if ($pid) { // parent script
        echo "Parent waiting at " . date("H:i:s") . "\n";
        pcntl_wait($status);
        echo "Parent done at " . date("H:i:s") . "\n";
    } else {
        // child script
        echo "Sleeper started at " . date("H:i:s") . "\n";
        include('sleeper.php');
        echo "Sleeper done at " . date("H:i:s") . "\n";
    }

?>

sleeper.php:

<?php
sleep(3);
?>  

输出:

$ php parent.php
Sleeper started at 01:22:02
Parent waiting at 01:22:02
Sleeper done at 01:22:05
Parent done at 01:22:05

然而,分叉本身并没有允许任何进程间通信,所以你必须找到一些其他的方式来告知孩子已经达到了特定的路线,像你的问题问父母。



Answer 3:

下面是一个在黑暗中拍摄:你可以尝试使用PHP的OS执行功能有&

exec("./somescript.php &");

此外,如果不工作,你可以试试

exec("nohup ./somescript.php &");

编辑: nohup的是POSIX命令忽略HUP(挂起)信号,使命令,以保持谁发出命令退出的用户后运行。 的HUP(挂起)信号是由常规的终端警告注销,这取决于过程的方式。



Answer 4:

pcntl_fork()做类似于你最终想要有所建树? http://www.php.net/manual/en/function.pcntl-fork.php



Answer 5:

如果你不想建了pcntl扩展,然后一个很好的选择是使用proc_open()。

http://www.php.net/manual/en/function.proc-open.php

使用与stream_select在一起(),所以你的PHP程序可以睡觉,直到有事跟你创建子进程。

这将有效地在后台创建一个进程,而不会阻塞父PHP进程。 你PHP可以读取和写入到STDIN,STDOUT,STDERR。

为了使浏览器加载完成(停止加载进度指示器),那么你可以使用哪些米兰Babuškov提及。

以使浏览器的关键认为HTTP请求完成,是向它发送的内容长度。 要做到这一点,你就可以开始缓冲的要求,然后刷新它,你发送的Content-Length头之后。

例如:

<?php

ob_start();

// render the HTML page and/or process stuff

header('Content-Length: '.ob_get_length());
ob_flush();
flush();

// can do more processing

?>


Answer 6:

您可以创建一个请求,并关闭它完成后立即被写入连接。

签中的代码http://drupal.org/project/httprl如能做到这一点(非阻塞请求)。 我打算推动这一lib添加到GitHub上,一旦我得到它更加精致; 东西可以的Drupal外面跑去。 这应该做你在找什么。



文章来源: Can a PHP script start another PHP script and exit?