Heim >Backend-Entwicklung >PHP-Tutorial >nginx - php pthreads apache cannot load 问题(windows)

nginx - php pthreads apache cannot load 问题(windows)

WBOY
WBOYOriginal
2016-06-06 20:29:031226Durchsuche

本机配置:
apache:2.2-x86
php:5.4 ts-x86
系统:windows 64

pthreads 配置
下载地址:http://windows.php.net/downloads/pecl/releases/pthreads/2.0.9/

pthreads 5.4 下两个文件:
php_pthreas.dll 和 pthreadVC2.dll

php_pthreas.dll 放入php ext文件中
pthreadVC2.dll 放入php 根目录

php.ini
extension=php_pthreads.dll

apache http.conf 配置
LoadFile "D:/wamp/php/pthreadVC2.dll"

然后重启apache 无法启动 cmd 进入apache/bin 命令 httpd -k start 报 cannot load pthreadVC2.dll

疑问:
是否是php版本要64位 apache 才能调用 pthreadVC2.dll?

测试代码:

<code><?php class AsyncOperation extends Thread {
  public function __construct($arg){
    $this->arg = $arg;
  }

  public function run(){
    if($this->arg){
      printf("Hello %s\n", $this->arg);
    }
  }
}
$thread = new AsyncOperation("World");
if($thread->start())
  $thread->join();
?></code>

通过apache 不加载 pthreadVC2.dll ,直接能打印出 helloword

nginx:
运行测试代码 毫无结果

提问:
php pthreads 多线程扩展 nginx 如何配置?

回复内容:

本机配置:
apache:2.2-x86
php:5.4 ts-x86
系统:windows 64

pthreads 配置
下载地址:http://windows.php.net/downloads/pecl/releases/pthreads/2.0.9/

pthreads 5.4 下两个文件:
php_pthreas.dll 和 pthreadVC2.dll

php_pthreas.dll 放入php ext文件中
pthreadVC2.dll 放入php 根目录

php.ini
extension=php_pthreads.dll

apache http.conf 配置
LoadFile "D:/wamp/php/pthreadVC2.dll"

然后重启apache 无法启动 cmd 进入apache/bin 命令 httpd -k start 报 cannot load pthreadVC2.dll

疑问:
是否是php版本要64位 apache 才能调用 pthreadVC2.dll?

测试代码:

<code><?php class AsyncOperation extends Thread {
  public function __construct($arg){
    $this->arg = $arg;
  }

  public function run(){
    if($this->arg){
      printf("Hello %s\n", $this->arg);
    }
  }
}
$thread = new AsyncOperation("World");
if($thread->start())
  $thread->join();
?></code>

通过apache 不加载 pthreadVC2.dll ,直接能打印出 helloword

nginx:
运行测试代码 毫无结果

提问:
php pthreads 多线程扩展 nginx 如何配置?

个人觉得pthreads这个扩展不适合应用在Apache/PHP-FPM这些Web服务上,因为这些服务本身就有自己的进程管理模型.在CLI下使用pthreads可能更好些.还有,需要注意的是,不要在线程里使用echo输出内容,否则会出现不可预知的错误和行为,比如乱码(garbled).尤其是在非CLI环境下,比如Apache/PHP-FPM.另外,我在Ubuntu上用Nginx+PHP-FPM跑下面的多线程程序,是能正常运行的:

<code><?php header('Content-Type: text/html; charset=utf-8');
ob_start();
function do_flush() {
    echo '<br />'.str_repeat(' ', 1024*4);
    ob_flush();
    flush();
}
class Request extends Thread {
    public $url;
    public $data;
    public function __construct($url) {
        $this->url = $url;
    }
    public function run() {
        // 线程处理一个耗时5秒的任务
        for($i=0;$iurl);
        $response = $this->url;
        if ($response) {
            $this->data = array($response);
        }
        //echo "线程: 任务完成<br>";
    }
}
$request = new Request('hello.html');
// 运行线程:start()方法会触发run()运行
if ($request->start()) {
    // 主进程处理一个耗时10秒的任务,此时线程已经工作
    for($i=0;$ijoin();
echo '线程返回数据: '.$request->data[0];
ob_end_flush();</code>

加载pthreads插件必须要求php是 ZTS Enabled ( Thread Safety ) 版,请自行检查相关版本

我将环境整体换了一下 apache2.4 php 5.6 ts-x64 threads 扩展 正常添加了

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn