【发布时间】:2015-11-17 22:34:44
【问题描述】:
我正在使用 PHP-FPM 运行 Phalcon 应用程序,并且刚刚安装了 pthreads,因此我可以开始异步运行任务。我目前有 pthreads 使用命令行界面工作:
<?php
/**
* Author: Abu Ashraf Masnun
* URL: http://masnun.me
*/
class WorkerThreads extends Thread
{
private $workerId;
public function __construct($id)
{
$this->workerId = $id;
}
public function run()
{
usleep(2000000); // 2 seconds
echo "Worker {$this->workerId} ran" . PHP_EOL;
}
}
// Worker pool
$workers = [];
// Initialize and start the threads
foreach (range(0, 5) as $i) {
$workers[$i] = new WorkerThreads($i);
$workers[$i]->start();
}
// Let the threads come back
foreach (range(0, 5) as $i) {
$workers[$i]->join();
}
die('finished');
^^ 所有这些都可以从 shell 运行 php test.php。
但是我无法使用快速进程管理器让这个示例工作。我有一个控制器正在初始化一个线程对象并调用start(),但run() 方法中的任何逻辑都没有按应有的方式执行。
控制器:
<?php
public function indexAction()
{
$threads=[];
for ( $i = 0; $i < 2; $i++ )
{
$threads[$i] = new AsyncThread();
$a = $threads[$i]->start();
$b = $threads[$i]->isStarted();
Phalcon\DI::getDefault()->get('logger')->log(json_encode($a));
Phalcon\DI::getDefault()->get('logger')->log(json_encode($b));
}
for ( $i = 0; $i < 2; $i++ )
{
$threads[$i]->join();
}
die('done');
AsyncThread.php:
<?php
class AsyncThread extends Thread
{
public function __construct()
{
Phalcon\DI::getDefault()->get('logger')->log( 'construct' );
}
public function run()
{
usleep(2000000); // 2 seconds
Phalcon\DI::getDefault()->get('logger')->log( 'running' );
}
}
当它运行时我的日志显示:
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] construct
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] true
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] true
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] construct
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] true
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] true
我希望看到异步“运行”日志,但它根本不会记录。
我的目标是获得一个使用 PHP-FPM 的 posix 线程的 hello world 示例,这样我就可以开始为我的需求构建一个经过深思熟虑的解决方案。
【问题讨论】: