【问题标题】:Multi threading in PHPPHP中的多线程
【发布时间】:2012-09-02 17:07:35
【问题描述】:

在 apcahe 服务器中,我想将 PHP 脚本作为 cron 运行,该脚本在后台启动一个 php 文件并在文件启动后立即退出,并且不等待脚本完成,因为该脚本需要大约 60 分钟才能完成完成。如何做到这一点?

【问题讨论】:

  • 每分钟在 cron 上运行你的脚本。您可以在文件上创建一些“互斥锁”的模拟,并检查之前的实例是否完成。 Apache 与您的任务无关。
  • 为什么不能“运行”cron?它是一项 cron 工作 - 所以您不需要等待它完成?

标签: php cron


【解决方案1】:

这可能不是您特定问题的最佳解决方案。但是为了记录,PHP中有线程。

https://github.com/krakjoe/pthreads

我假设你知道如何使用线程,这是我自己编写的非常年轻的代码,但如果你有线程和互斥锁等方面的经验,你应该能够使用这个扩展解决你的问题。

这显然是我自己项目的无耻插件,如果用户没有安装扩展所需的访问权限,那么它对他没有帮助,但是很多人发现stackoverflow,它无疑会解决其他问题。 ..

【讨论】:

    【解决方案2】:

    您应该知道 PHP 中没有线程。 但是,如果您在 Unix/linux 系统上运行,则可以轻松执行程序并分离它们。

    $command = "/usr/bin/php '/path/to/your/php/to/execute.php'";
    exec("{$command} > /dev/null 2>&1 & echo -n \$!");
    

    可以完成这项工作。让我们解释一下:

    exec($command); 
    

    执行 /usr/bin/php '/path/to/your/php/to/execute.php' :您的脚本已启动,但 Apache 将在执行下一个代码之前等待执行结束。

    > /dev/null
    

    会将标准输出(即您的回显、打印等)重定向到一个虚拟文件(其中写入的所有输出都将丢失)。

    2>&1
    

    将错误输出重定向到标准输出,写入相同的虚拟和不存在的文件。例如,这可以避免将日志记录到您的 apache2/error.log 中。

    &
    

    在您的情况下是最重要的:它将分离您对 $command 的执行:因此 exec() 将立即释放您的 php 代码执行。

    echo -n \$!
    

    将给出你分离执行的PID作为响应:它将由exec()返回并让你能够使用它(例如,将此pid放入数据库并在一段时间后将其杀死以避免僵尸)。

    【讨论】:

    • 很好地解释了论点。
    【解决方案3】:

    您需要使用“&”符号将程序作为后台进程运行。

    $ php -f file.php &
    

    这将在后台运行此命令。

    你可以编写 sh 脚本

    #!/bin/bash
    php -f file.php &
    

    然后从 crontab 运行这个脚本。

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 1970-01-01
      • 2011-06-17
      • 2012-10-19
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      相关资源
      最近更新 更多