PHP-FPM 和 pthreads
PHP-FPM and pthreads
我正在使用 PHP-FPM 来 运行 Phalcon 应用程序,并且刚刚安装了 pthreads,因此我可以异步启动 运行ning 任务。我目前有 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');
^^ 运行ning php test.php
所有这些都来自 shell.
但是我无法使用快速进程管理器使这个示例工作。我有一个控制器初始化一个线程对象并调用 start()
,但是 run()
方法中的逻辑 none 执行正常。
控制器:
<?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
我希望看到 'running' 异步记录,但它根本不记录。
我的目标是得到一个 posix 线程与 PHP-FPM 一起工作的 hello world 示例,这样我就可以开始构建一个深思熟虑的解决方案来满足我的需求。
如果您使用旧版本的 PHP 和 pthreads (< PHP7),那么线程将 运行 没有正确设置标准输出(因为 FPM 和 Zend 有没办法设置)。
最新版本的 pthreads(PHP7)禁止在除 CLI 以外的任何地方执行。
无法在应用程序的前端明智地使用线程。
考虑创建合理数量线程的控制器的情况,比方说 8。如果 100 个客户端同时请求控制器,您将要求您的硬件同时执行 800 个内核线程,微小的流量。
这种架构无法扩展。
你一直用异步这个词代替并行,这让我觉得你可能根本不需要线程。
如果手头的任务是发出一些异步 Web 请求,那么最好的方法是使用非阻塞 I/O, 而不是线程 。
如果您错误地使用了异步这个词,而实际上是指并行,那么您将需要为应用程序的那些需要与 Web 服务器扩展的部分以及应用程序的那些部分找到另一种方式需要并行并发才能相互通信。
我正在使用 PHP-FPM 来 运行 Phalcon 应用程序,并且刚刚安装了 pthreads,因此我可以异步启动 运行ning 任务。我目前有 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');
^^ 运行ning php test.php
所有这些都来自 shell.
但是我无法使用快速进程管理器使这个示例工作。我有一个控制器初始化一个线程对象并调用 start()
,但是 run()
方法中的逻辑 none 执行正常。
控制器:
<?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
我希望看到 'running' 异步记录,但它根本不记录。
我的目标是得到一个 posix 线程与 PHP-FPM 一起工作的 hello world 示例,这样我就可以开始构建一个深思熟虑的解决方案来满足我的需求。
如果您使用旧版本的 PHP 和 pthreads (< PHP7),那么线程将 运行 没有正确设置标准输出(因为 FPM 和 Zend 有没办法设置)。
最新版本的 pthreads(PHP7)禁止在除 CLI 以外的任何地方执行。
无法在应用程序的前端明智地使用线程。
考虑创建合理数量线程的控制器的情况,比方说 8。如果 100 个客户端同时请求控制器,您将要求您的硬件同时执行 800 个内核线程,微小的流量。
这种架构无法扩展。
你一直用异步这个词代替并行,这让我觉得你可能根本不需要线程。
如果手头的任务是发出一些异步 Web 请求,那么最好的方法是使用非阻塞 I/O, 而不是线程 。
如果您错误地使用了异步这个词,而实际上是指并行,那么您将需要为应用程序的那些需要与 Web 服务器扩展的部分以及应用程序的那些部分找到另一种方式需要并行并发才能相互通信。