【问题标题】:Parallelizing PHP processes with a Bash Script?使用 Bash 脚本并行化 PHP 进程?
【发布时间】:2011-09-29 07:29:44
【问题描述】:

我想从一个 bash 脚本启动 ~10 个 php 进程。当其中一个完成时,我希望 bash 脚本启动另一个 php 进程,并无限期地继续运行,始终有大约 10 个 php 进程在运行。

最简单的方法是什么?

每次启动的 php 文件都是相同的,但 php 进程会知道从数据库中提取新值,因此每次都在处理新数据。我需要启动的文件和它的所有类都已经用 php 编写了。

【问题讨论】:

    标签: php bash parallel-processing


    【解决方案1】:

    似乎很适合superivisord。以下配置将确保 10 个进程始终在运行,并处理日志轮换,这也很方便。所有输出,包括 stderr,都将写入 /var/log/worker.log。使用“autorestart=true”,supervisord 将在子进程退出后立即替换它。

    [program:worker]
    command=php /path/to/worker.php
    process_name=%(program_name)s_%(process_num)d
    stdout_logfile=/var/log/%(program_name)s.log
    redirect_stderr=true
    stdout_capture_maxbytes=512MB
    stdout_logfile_backups=3
    numprocs=10
    numprocs_start=0
    autostart=true
    autorestart=true
    

    一旦您有了主管配置(通常是 /etc/supervisord/conf.d),您就可以使用 supervisorctl 作为启动和停止进程组的便捷方式。

    $ supervisorctl start worker
    ...
    $ supervisorctl stop worker
    ...
    $ supervisorctl status
    worker:worker_0              RUNNING    pid 8985, uptime 0:09:24
    worker:worker_1              RUNNING    pid 10157, uptime 0:08:52
    ...
    worker:worker_9              RUNNING    pid 12459, uptime 0:08:31
    

    【讨论】:

    • 这非常有效,只花了几个小时就可以使用许多其他功能。谢谢。
    【解决方案2】:

    您可以使用 GNU Parallel,将要管理的图像列表通过管道传输到 parallel,如 here 所述。

    【讨论】:

      【解决方案3】:

      你可以使用这样的东西。使用一个文件启动 10(只运行一次),每个文件的底部可以在完成后重新启动。

      /** 
       * Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.  
       *
       * @param string $filename      file to execute, relative to calling script (or root?)
       * @param string $options       (optional) arguments to pass to file via the command line
       */ 
      function asyncInclude($filename, $options = '') {
          exec("/path/to/php -f {$filename} {$options} >> /dev/null &");
      }
      

      【讨论】:

        【解决方案4】:
        jcomeau@intrepid:/tmp$ cat test.sh
        #!/bin/sh
        set -m  # monitor mode
        task="php-cgi /tmp/sleep.php"
        function do_task {
         $task >/dev/null &
         echo -n spawned $! ' ' >&2
        }
        trap do_task SIGCHLD
        for i in $(seq 1 10); do
         do_task
        done
        while true; do
         wait
        done
        
        jcomeau@intrepid:/tmp$ cat sleep.php
        <?php sleep(3); ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-12
          • 1970-01-01
          • 1970-01-01
          • 2016-12-27
          • 1970-01-01
          • 2015-04-03
          相关资源
          最近更新 更多