我正在使用 wampserver 在我的本地计算机上测试和运行 wordpress 代码。为了运行 pthread,我遵循了以下步骤:
1) 我从 http://windows.php.net/downloads/pecl/releases/pthreads/0.44/ 得到了 pthread zip 文件
(我的机器有 php 5.3.13 并从上面的链接下载了 php_pthreads-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
,在开头添加代码extension=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();
?>
它给我以下错误:
fatal error :在第 2 行的 C:\wamp\www\wp-admin\includes\post.php 中找不到“线程”类
你能告诉我如何在我的电脑上安装 pthreads 以与 php 一起使用吗?我必须安装任何其他软件吗?
最佳答案
我注意到 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”类的“类”,以便在另一个线程中实际执行某些操作。 Thread类中的“run()”函数是“抽象的”,需要在扩展类中作为实际函数“实现”。然后“new”运算符可以创建一个“实例”,即指定类的对象,以供实际使用。这是我需要的类(class):
//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()”函数是专门为基本 Thread 类的扩展而创建的。下面是使用该类的一些代码:
$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 处理器完成委托(delegate)给第二个线程的工作。 7. 当第二个线程终止时,浏览器现在接收到回显数据!
在撰写本文时,我想我错过了一些东西。也许我需要在第一个线程结束时做一些强制性的“刷新”操作,以便浏览器可以接收回显数据,并且用户可以在服务器上的 PHP 处理器也在做事的同时做事。
关于php - 如何让 pthreads 在 PHP 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17417242/