Как заставить pthreads работать в PHP?

Я использую wampserver для тестирования и запуска кода WordPress на моем локальном компьютере. Чтобы запустить pthread, я выполнил следующие шаги:

1) Я получил zip-файл pthread из http://windows.php.net/downloads/pecl/releases/pthreads/0.44/ (Моя машина имеет php 5.3.13 и php_pthreads-0.44-5.3-ts-vc9-x86.zip file из приведенной выше ссылки).

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 кода 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: Class 'Thread' not found in C:\wamp\www\wp-admin\includes\post.php on line 2

Не могли бы вы рассказать мне, как установить pthreads на моем компьютере для использования с php? и мне нужно установить любое другое программное обеспечение?

Я заметил, что у wampserver есть php.ini в двух разных местах. Одно место находится в каталоге / wamp / bin / php / php5 …, а другое место находится в каталоге /wamp/bin/apache/apache…/bin (где «…» представляет номера версий) , Эти два файла должны быть одинаковыми, потому что, по-видимому, оба они загружаются в разное время общей процедурой загрузки wampserver.

(Заметьте, что я только недавно обнаружил это, и может быть хорошо «за кривой» делать причудливые вещи с помощью wampserver – пусть все остальные будут иметь дело с обоими файлами в течение длительного времени. Поэтому я не знаю, будет ли эта простая вещь исправьте свою проблему, я пришел сюда, ища информацию, о себе, о том, как делать многопоточность. 🙂

Еще одна вещь. Согласно этой странице: http://www.php.net/manual/en/pthreads.requirements.php PHP должен быть скомпилирован с помощью «–enable-zts» для работы pthreads. Я не смог найти никаких доказательств того, что часть PHP-сервера wampserver была скомпилирована таким образом.


(несколько месяцев спустя) Решив, что мне действительно не нужно было делать какие-либо материалы, я продолжал делать другие вещи, пока не возникла необходимость. Теперь я могу сказать, что версия PHP, скомпилированная в WampServer , поддерживает расширение «pthread», хотя сначала требуется какая-то работа по настройке. В инструкциях, которые я видел, упоминалось о том, чтобы поместить несколько DLL-файлов (после загрузки и разблокировки) в определенные места, но это не сработало для меня. Копирование их в каталог \ Windows \ System32 действительно сработало. (Ввод их в каталог \ apache … \ bin также работает, есть и другие файлы php .dll).

После этого, как и то, что вы сделали, необходимо определить «класс», который расширяет класс «Thread», чтобы фактически что-то сделать в другом потоке. Функция «run ()» в классе Thread является «абстрактной» и должна быть «реализована» как действительная функция расширенного класса. Тогда «новый» оператор может создать «экземпляр», объект этого указанного класса, для фактического использования. Вот класс, который мне нужен:

 //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 

Обратите внимание, что для тех, кто копирует этот код, вам может потребоваться убедиться, что ваш параметр «open_basedir» в php.ini разрешает доступ к указанному файлу.


Еще несколько месяцев спустя: с большим количеством вещей, над которыми я работаю, я не тратил много времени на использование моего объекта pthread. Я столкнулся с особенностью, которая заставляет меня задуматься, действительно ли я могу использовать pthreads так, как я надеялся. Вот что я заметил: 1. Первоначальный php-файл вызывается AJAX, чтобы что-то сделать. 2. Обработчик PHP на веб-сервере делает это. 3. Предполагается, что в браузере будут отображаться различные данные. 4. Первоначальный php-файл вызывает создание другого потока и завершается. 5. Браузер еще не получил эхо-данные! 6. Процессор PHP на веб-сервере выполняет работу, делегированную во второй поток. 7. Когда второй поток завершается, СЕЙЧАС браузер получает эхо-данные!

На этом письме я думаю, что я что-то пропустил. Возможно, мне нужно сделать некоторые сильные «флеш», когда заканчивается первый поток, так что браузер может получать эхо-данные, и пользователь может делать что-то, в то время как PHP-процессор на сервере также делает что-то.

Проверьте файл extension_dir = "ext" в файле php.ini. Убедитесь, что он указывает на папку, в которой находятся ваши расширения, и убедитесь, что она не прокомментирована (у нее есть точка с запятой ; перед ней)

Вы должны добавить require_once () с контуром класса Thread перед его расширением (если ваша инфраструктура не использует систему класса автозагрузки)

Я столкнулся с одной и той же проблемой, в моем случае размещение pthreadVC2.dll в

 ..wamp\bin\apache\Apache2.4.4\bin 

(вместо ..\wamp\bin\php\php5.4.16 как указано в инструкциях php.net), решила проблему

У Wamp-сервера есть отдельный файл конфигурации php.ini для браузера и для cli.

Чтобы использовать модуль pthreads в браузере с WAMP Server, вам также нужно скопировать «pthreadVC2.dll» в каталог «bin» apache.

Теперь у вас должна быть «pthreadVC2.dll» в обеих папках (если они установлены по умолчанию):

 C:\wamp\bin\php\php[xxxx]\bin C:\wamp\bin\apache\apache[xxx]\bin 

Вам также потребуется обновить файл php.ini в каталоге php bin и в каталоге apache bin, чтобы включить:

 extension=php_pthreads.dll 

Это означает, что вы можете использовать pthreads в браузере и в cli с wamp-сервером

После столкновения с той же проблемой я заметил, что я установил неверную версию Pthread (3.1.6: требуется PHP7 +), которая не была совместима с моей версией PHP (5.5.12). Решена проблема с Pthread версии 0.0.44. Раньше версия, вероятно, хорошо работала.

Вот страница загрузки для Pthread и страницы установки . Будьте осторожны с местоположением обоих php.ini, как указано выше (Apache folder = для браузера, PHP folder = CLI).