如何让pthread在PHP中工作?
我正在使用wampserver在本地计算机上测试和运行wordpress代码。为了运行pthread,我遵循了以下步骤: 1) 我从中获得了pthread zip文件 (我的机器有PHP5.3.13,并从上面的链接下载了如何让pthread在PHP中工作?,php,multithreading,pthreads,Php,Multithreading,Pthreads,我正在使用wampserver在本地计算机上测试和运行wordpress代码。为了运行pthread,我遵循了以下步骤: 1) 我从中获得了pthread zip文件 (我的机器有PHP5.3.13,并从上面的链接下载了phppthreads-0.44-5.3-ts-vc9-x86.zip文件) 2) 解压缩了zip文件。将php_pthreads.dll移动到C:\wamp\bin\php\php5.3.13\ext目录 3) 将pthreadVC2.dll移动到C:\wamp\bin\php
phppthreads-0.44-5.3-ts-vc9-x86.zip文件)
2) 解压缩了zip文件。将php_pthreads.dll移动到C:\wamp\bin\php\php5.3.13\ext
目录
3) 将pthreadVC2.dll移动到C:\wamp\bin\php\php5.3.13
目录
4) 然后打开C:\wamp\bin\php\php5.3.13\php.ini
,并在文件开头添加代码扩展名=php_pthreads.dll
但当我尝试运行以下代码时:
<?php
class My extends Thread {
public function run() {
printf("%s is Thread #%lu\n", __CLASS__, $this->getThreadId());
}
}
$my = new My();
$my->start();
?>
它给了我以下错误:
致命错误:在第2行的C:\wamp\www\wp admin\includes\post.php中找不到类“Thread”
你能告诉我如何在我的计算机上安装pthreads来与php一起使用吗?我需要安装其他软件吗 检查php.ini文件中的扩展名\u dir=“ext”
。确保它指向扩展所在的文件夹,并且确保它没有被注释(它前面有一个分号;
)我注意到wampserver在两个不同的地方有php.ini。一个位置是/wamp/bin/php/php5。。。目录,另一个位置在/wamp/bin/apache/apache…/bin目录中(其中“…”表示版本号)。这两个文件需要完全相同,因为整个wampserver启动过程显然在不同的时间加载这两个文件
(注意,我是最近才发现这一点的,并且可能在使用wampserver做一些奇特的事情时“落后于曲线”——也许其他人已经处理这两个文件很长时间了。所以我不知道这个简单的事情是否能解决您的问题;我来这里是想了解一些关于做一些多线程事情的信息。:)
还有一件事。根据此页面:www.php.net/manual/en/pthreads.requirements.php
PHP必须使用“-enable zts”进行编译,才能使pthreads工作。我还没有找到任何证据表明wampserver的PHP部分是以这种方式编译的
(几个月后)
我已经决定不需要立即做任何线程的事情,我继续做其他的事情,直到需要真正出现。现在我可以说编译到WampServer中的PHP版本确实支持“pthread”扩展,尽管首先需要进行一些设置工作。我看到的说明中提到将几个.dll文件(下载并解压缩后)放在某些地方,但这对我不起作用。将它们复制到\Windows\System32目录确实有效。(将它们放入\apache…\bin目录也可以;其中还有一些其他php.dll文件。)
之后,就像您所做的一样,有必要定义一个扩展“线程”类的“类”,以便在另一个线程中实际执行某些操作。Thread类中的“run()”函数是“抽象的”,需要作为扩展类中的实际函数“实现”。然后,“new”操作符可以创建一个“instance”,即指定类的对象,以供实际使用。这是我需要的课程:
//Purpose: Use another thread to run the code in another php file, after a delay
class xT extends Thread
{ var $fil, $tim;
function savWhatWhen($f="", $t=0)
{ $this->fil = $f; //save What, file to process
$this->tim = $t; //save When, delay before processing file
return;
}
function run()
{ ini_set('max_execution_time', 600); //600 seconds = 10 minutes
sleep($this->tim); //do a delay; beware of max-exec-time!
include($this->fil); //load file-to-process, and process it
return;
} }
“savWhatWhen()”函数是专门为基本线程类的这个扩展创建的。下面是使用该类的一些代码:
$TH = new xT(); //prepare a separate Thread
$TH->savWhatWhen("d:/wamp/myscripts/test.php", 45);//file-name and delay time
$TH->start(); //after delay, process file
//the code that does this can terminate, while OTHER thread is doing a delay
注意:对于任何复制此代码的人,您可能需要确保php.ini中的“open_basedir”设置允许访问指定的文件
几个月后:由于有很多工作正在进行,我没有花太多时间使用pthread对象。我确实遇到了一个怪癖,它让我怀疑我是否能够按照我所希望的方式使用pthreads。以下是我观察到的情况:
1.AJAX调用一个初始php文件来执行某些操作。
2.Web服务器上的PHP处理器就是这样做的。
3.各种数据都应该被回送到浏览器上。
4.初始php文件调用创建另一个线程,并终止。
5.浏览器尚未接收回显数据!
6.Web服务器上的PHP处理器执行委托给第二个线程的工作。
7.当第二个线程终止时,现在浏览器接收回显数据
在写这篇文章的时候,我想我错过了什么。也许我需要在第一个线程结束时执行一些强制的“刷新”操作,以便浏览器可以接收回显数据,用户可以在服务器上的PHP处理器也在执行操作时执行操作。在扩展线程类之前,必须在线程类的路径中添加require_once()(如果您的框架不使用自动加载类系统)我遇到了同样的问题,在我的例子中,将pthreadVC2.dll放入
..wamp\bin\apache\Apache2.4.4\bin
(而不是php.net中的指南所指示的。\wamp\bin\php\php5.4.16
)解决了问题wamp服务器为浏览器和cli提供了一个单独的php.ini配置文件
要在WAMP服务器上使用浏览器中的pthreads模块,还需要将“pthreadVC2.dll”复制到apache的“bin”目录中
您现在应该在这两个文件夹中都有“pthreadVC2.dll”(如果安装在默认位置):
您还需要更新php bin目录和apache bin目录中的php.ini文件,以包括:
extension=php_pthreads.dll
这意味着您可以在浏览器中使用pthreads,也可以在wamp服务器的cli中使用pthreads。遇到同样的问题后,我注意到我安装了错误的Pthread版本(3.1.6:需要PHP7+),该版本与我的PHP版本(5.5.12)不兼容。解决了Pthread版本0.0.44的问题。早期版本可能可以正常工作
这是和。注意上面提到的php.ini位置(Apache folder=for Browser,php folder=CLI)。它指向正确的文件夹ext
extension=php_pthreads.dll