Псевдомногопоточность в PHP на WIN/Apache

mazilla

Новичок
Псевдомногопоточность в PHP на WIN/Apache

Вот такие два ПХП скрипта работают на Apache под юникс.
#1.
<?php
for($i=0;$i<5;$i++)
{
$log="log".$i.".html";
$cmd='php /home/xxxx/public_html/th.php > /home/xxxx/public_html/[log] &';
$cmd=str_replace("[log]", $log, $cmd);
echo "look thread #$i in <a target=_blank href=$log>$log</a><br>";
exec($cmd);
echo $cmd."<br>";
}
echo "DONE";
?>


#2. th.php

<?php
echo "hello world";
?>

Результатом выполнения скрипта #1 является
одновременный запуск 5 копий th.php, каждая
из которых записывает аутпут в свой собственный лог.

Подскажите, пожалуйста, есть ли возможность
организовать подобные параллельные процессы на апаче под виндоус?
Пробовал заменить команду на
$cmd='start c:/php/php.exe z:/home/multi/www/th.php >
z:/home/multi/www/[log]';

В результате th.php срабатывают, пусть и
последовательно, файлы logN.html создаются,
но в них ничего не записывается.
PHP 4.3.11 Apache 1.3.33 WinXP
 

svetasmirnova

маленький монстрик
& в конце $cmd убери. И пути проверь. > в Windows работает так же как и в UNIX
 

mazilla

Новичок
в моих руках сей подход так и не сработал
не пишет в логи, нет процессов в бэкграунде

Таким макаром - работает

for($i=0;$i<5;$i++)
{

$log="log".$i.".html";

$cmd='start /b c:/php/php.exe z:/home/multi/www/thread.php > z:/home/multi/www/[log]';

$cmd=str_replace("[log]", $log, $cmd);
echo "look thread #$i in <a target=_blank href=$log>$log</a><br>";
chdir ('c:/php');
pclose(popen($cmd, 'r'));
echo $cmd."<br>";


}
echo "RRRRRRRRRRRRRRRRR";

-~{}~ 13.03.06 15:35:

1. почему-то эта схема не работает для курла, если идет обращение к нему в треде. curl_init() не определена, в выдаче phpinfo() этот модуль отсутствует. Кто знает, почему так происходит?

2. Пытался обойти проблему, закомментировав ;extension=php_curl.dll и вызывая курл с помощью dl("php_curl.dll"); .
Получил странный варнинг
Warning: dl(): Not supported in multithreaded Web servers - use extension statements in your php.ini in z:\home\multi\www\tmp.php on line 33
Причем не происходит подгрузки не только в тредах, но и в обычном скрипте.
А ведь на Апаче под виндами эта функция должна работать?

-~{}~ 13.03.06 15:36:

Автор оригинала: mazilla
в моих руках сей подход так и не сработал
не пишет в логи, нет процессов в бэкграунде

Таким макаром - работает

for($i=0;$i<5;$i++)
{

$log="log".$i.".html";

$cmd='start /b c:/php/php.exe z:/home/multi/www/thread.php > z:/home/multi/www/[log]';

$cmd=str_replace("[log]", $log, $cmd);
echo "look thread #$i in <a target=_blank href=$log>$log</a><br>";
chdir ('c:/php');
pclose(popen($cmd, 'r'));
echo $cmd."<br>";


}
echo "RRRRRRRRRRRRRRRRR";

-~{}~ 13.03.06 15:35:

1. почему-то эта схема не работает для курла, если идет обращение к нему в треде. curl_init() не определена, в выдаче phpinfo() этот модуль отсутствует. Кто знает, почему так происходит?

2. Пытался обойти проблему, закомментировав ;extension=php_curl.dll и вызывая курл с помощью dl("php_curl.dll"); .
Получил странный варнинг
Причем не происходит подгрузки не только в тредах, но и в обычном скрипте.
А ведь на Апаче под виндами эта функция должна работать?
 

svetasmirnova

маленький монстрик
>Пытался обойти проблему, закомментировав ;extension=php_curl.dll и вызывая курл с помощью dl("php_curl.dll"); .
Лучше посмотри где у тебя конфиг находится.
>А ведь на Апаче под виндами эта функция должна работать?
Со вторым Апачом и 5.1 были проблемы (но тогда релиза ещё не было, после не нужно было). С первым работает.
 

svetasmirnova

маленький монстрик
При чём здесь dl? Он тебе не нужен.
>не могла бы объяснить, что имела ввиду?
phpinfo -> Ctrl+F -> php.ini и смотреть путь
 

mazilla

Новичок
У меня C:\WINDOWS\php.ini

Допустим, но как это может помочь?
Ведь тред же нормально запускается с помощью popen('start /b c:/php/php.exe z:/home/multi/www/thread.php > z:/home/multi/www/[log]' )

Только курл не хочет подключаться. Значит, не в php.ini проблема, или я неправильно понимаю?

-~{}~ 13.03.06 21:31:

Кстати, плиз, ты не могла бы запустить их у себя, если конечно ты в виндах с пхп работаешь.

первый (надо только путь подправить)

<?php
for($i=0;$i<2;$i++)
{

$log="log".$i.".html";

$cmd='start /b c:/php/php.exe z:/home/multi/www/thread.php > z:/home/multi/www/[log]';

$cmd=str_replace("[log]", $log, $cmd);
echo "look thread #$i in <a target=_blank href=$log>$log</a><br>";
chdir ('c:/php');
pclose(popen($cmd, 'r'));
echo $cmd."<br>";
sleep (2);
flush();
}
echo "DONE"; ?>

второй

<?php
phpinfo();
?>


Все увидишь сама, ну если интересно, само собой :))
 

svetasmirnova

маленький монстрик
>Только курл не хочет подключаться. Значит, не в php.ini проблема, или я неправильно понимаю?
Замечание для пользователей Win32: Для работы с этим модулем в Windows необходимо скопировать файлы libeay32.dll и ssleay32.dll из директории DLL Win32 дистрибутива PHP в директорию SYSTEM (Нпример C:\WINNT\SYSTEM32 или C:\WINDOWS\SYSTEM)
>Кстати, плиз, ты не могла бы запустить их у себя, если конечно ты в виндах с пхп работаешь.
Упрости пример и заставь работать запись в какой-нибудь предопределённый файл, потом усложняй. Например для командной строки (php у меня в путях, в твоём случае может понадобиться полный путь):
PHP:
php -r "exec('php -r \"echo \'OK\';\" > test1303.txt');"
 

mazilla

Новичок
Да нет, курл работает на ура при обычном запуске.
Только если запускать как я написал не работает.
НО сам запуск работает отлично (БЕЗ курла, например, со СНУПИ). и по-другому параллельные процессы в бекграунде в виндах не запустишь.
Так что по отдельности все работает, только вместе не хотит :)
 
Сверху