代码之家  ›  专栏  ›  技术社区  ›  Chris

后台处理完成后PHP启动脚本?

  •  4
  • Chris  · 技术社区  · 16 年前

    我正在用pdf2swf转换PDF并用xpdf索引。与执行…只有这样,执行时间才会非常长。

    是否可以将其作为后台进程运行,然后在转换完成后启动脚本?

    3 回复  |  直到 13 年前
        1
  •  2
  •   Phil Rykoff    16 年前

    通常,PHP不实现线程。

    但是有一个ZF类可能适合您:

    http://framework.zend.com/manual/en/zendx.console.process.unix.overview.html

    Zendx控制台进程Unix允许 开发人员将生成一个新对象 处理多个任务 在控制台环境中并行。 因为它的特殊性 只工作 基于NIX的系统 像Linux、Solaris、Mac/OSX等等。 此外,SHMOP_ ,PCNTL**和 这需要posix_*模块 要运行的组件。如果其中一个 不满足要求,会抛出 在实例化 组件。

    合适的例子:

    class MyProcess extends ZendX_Console_Process_Unix
    {
        protected function _run()
        {
            // doing pdf and flash stuff
        }
    }
    
    $process1 = new MyProcess();
    $process1->start();
    
    while ($process1->isRunning()) {
    
        sleep(1);
    
    }
    
    echo 'Process completed';
    

    .

        2
  •  0
  •   Sebastián Grignoli    16 年前

    尝试使用popen()而不是exec()。

    这个黑客程序可以在任何标准的PHP安装上工作,即使在Windows上,也不需要额外的库。你不能用这种方式控制你产生的过程的所有方面,但有时这就足够了:

    $p1 = popen("/bin/bash ./some_shell_script.sh argument_1","r");
    $p2 = popen("/bin/bash ./some_other_shell_script.sh argument_2","r");
    $p2 = popen("/bin/bash ./yet_other_shell_script.sh argument_3","r");
    

    三个生成的shell脚本将同时运行,只要您不执行pclose($p1)(或$p2或$p3)或尝试从这些管道中读取,它们就不会阻止您的PHP执行。

    当你完成了其他的工作(你用PHP脚本完成的工作)后,你可以在管道上调用pclose(),这将暂停你的脚本执行,直到你的pcloss过程结束。然后你的脚本可以做其他的事情。

    注意,在这些脚本完成之前,您的PHP不会结束或消亡()。到达脚本结尾或调用die()将使其等待。

        3
  •  -1
  •   Cetra    16 年前

    如果从命令行运行它,则可以使用 pcntl_fork

    还有一些守护进程类可以实现相同的技巧:

    http://pear.php.net/package/System_Daemon

    $pid = pcntl_fork();
    if ($pid == -1) {
         die('could not fork');
    } else if ($pid) {
    
         //We are the parent, exit
    exit();
    
    } else {
    
    // We are the child, do something interesting then call the script at the end.
    
    }
    
    推荐文章