【问题标题】:How to execute a php script from another?如何从另一个执行 php 脚本?
【发布时间】:2012-08-24 21:58:40
【问题描述】:

如何从另一个执行 php 脚本?

我想从我的 php 文件中执行 3 个 php 脚本,而无需等待 3 个脚本完成。换句话说,这 3 个 php 文件需要一次全部执行(并行)而不是一个接一个(顺序执行)。

这 3 个脚本位于我的主 php 文件(脚本)的同一文件夹中。

【问题讨论】:

标签: php apache exec exe


【解决方案1】:

如果您不想等待它们完成,请使用任一方法运行它们

exec('php script.php &> /dev/null &');
shell_exec('php script.php &> /dev/null &');
system('php script.php &> /dev/null &');
`php script.php &> /dev/null &`

任何一个都应该完成这项工作,具体取决于您的 PHP 配置。虽然它们是不同的函数,但它们的行为应该相似,因为所有输出都被重定向到 /dev/null 并且进程被立即分离。

我在生产环境中使用第一个解决方案,其中客户端启动一个 bash 短信发送脚本,该脚本可能需要 10 分钟才能完成,它从未失败过。

更多信息在:http://php.net/exec·http://php.net/shell_exec·http://php.net/system

【讨论】:

  • @faressoft 我的示例的每一行都按预期工作,刚刚尝试过,您的服务器设置有问题,现在与这里的问题和答案无关。
【解决方案2】:

exec("php yourscript.php")怎么样

请考虑使用队列系统来存储您的 php 脚本名称和工作人员以从队列中获取数据并执行例如beanstalkd

【讨论】:

  • 这将等待脚本完成后再开始下一个。
  • @Kolink 更新了答案.. 使用队列存储和使用其他工作人员运行。这总是做这件事的好方法。
【解决方案3】:

您需要将它们作为独立作业运行,这并不容易 - 或可移植。通常的解决方案是使用nohup 或执行脚本并将stdout 和stderr 重定向到/dev/null(或Windows 中的NUL),但这通常会出现问题。

如果可能,将这三个脚本作为脚本在 Web 服务器上可用,并通过 异步 cURL 函数访问它们。这还具有能够通过浏览器测试脚本并为您提供脚本输出的优势。

其他方法包括使用popen(),或者如果在Linux 下使用atbatch 实用程序。

【讨论】:

    【解决方案4】:

    取自http://board.phpbuilder.com/showthread.php?10351142-How-can-I-exec%28%29-in-a-non-blocking-fashion:

    为了执行一个命令,让它在运行时不挂起你的 php 脚本,你运行的程序一定不能输出回 php。为此,请将 stdout 和 stderr 都重定向到 /dev/null,然后将其置于后台。

    > /dev/null 2>&1 &
    

    为了执行一个命令并让它作为另一个不依赖于 apache 线程的进程继续运行(如果有人取消页面不会死)运行这个:

    exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
    

    对于windowshttp://www.php.net/manual/en/function.exec.php

    function execInBackground($path, $exe, $args = "") {
    global $conf;
    
    if (file_exists($path . $exe)) {
        chdir($path);
        if (substr(php_uname(), 0, 7) == "Windows"){
            pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r"));   
        } else {
            exec("./" . $exe . " " . escapeshellarg($args) . " > /dev/null &");   
        }
    }
    

    【讨论】:

      【解决方案5】:

      在 shell_exec 中添加 '/B' 参数,这允许您一次运行多个可执行文件。 请参阅我对这个问题的回答:PHP on a windows machine; Start process in background

      都一样。

      shell_exec('start /B "C:\Path\to\program.exe"); /B 参数是关键 这里。我试图再次为您找到主题,但我似乎无法 找到它了。这对我有用。

      我希望这可以为您解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        相关资源
        最近更新 更多