Синхронизация Php-скриптов

#php #multithreading #synchronization

#php #многопоточность #синхронизация

Вопрос:

Мне нужно запустить некоторый php-скрипт в фоновом режиме (без ожидания), а затем дождаться завершения всех процессов, что-то (если вы знакомы с многопоточностью) похожее на барьер.

Пример:

 //...code...

run_script('myscript1.php');//it's like an exec but doesen't wait for the script to finish
run_script('myscript2.php');//it's like an exec but doesen't wait for the script to finish
run_script('myscript3.php');//it's like an exec but doesen't wait for the script to finish

do_something();

wait_until_all_proc_are_finished();//it will wait until all script are executed
do_something_else();
//....
  

Я создал скрипт, который должен сработать; я протестировал его в консоли, и он отлично работает, но он не работает на php-страницах, я не понимаю почему!

 class TSync{
    private $threads=array();
    function tcreate($p){
            $tname=tempnam(null,'THS_');//create a temp name               

            $p=addslashes($p);//just to be sure

            $name=addslashes($tname);

            $ex= 'php -r "$fp=fopen(''.$name.'','r ');flock($fp,LOCK_EX);include(''.$p.'');fclose($fp);"';

            run_on_background($ex);//execute it on background      

            $this->threads[count($this->threads)]=$tname;

            return count($this->threads)-1;//returns the thread "id"

    }
    function twait($id){
        $f=$this->threads[$id];//recover the name
        /***even this doesen't work***
        $fp=fopen($f,'r');
        flock($fp,LOCK_EX);
        fclose($fp);   
        */
        echo date("H:i:s"),"#Locking on $f<br/>";

        $ex= 'php -r "$fp=fopen(''.$f.'','r');flock($fp,LOCK_EX);fclose($fp);"';

        exec($ex);
        unlink($f);

    }


}

$t=new TSync();//create the class

$f=$t->tcreate(dirname(__FILE__).'/testth.php');//this is a test script that waits 10s
$t->twait($f);//now you should wait the script,commenting this line should result on the script not waiting
  

Пример эффективного кода, запущенного на консоли (протестирован на Windows)

 start /b php.exe -r "$fp=fopen('C:\Windows\Temp\THS6D7.tmp','w');flock($fp,LOCK_EX);include('C:/.../testth.php');fclose($fp);"
  

Если я запущу код несколько раз, второй скрипт будет ждать первого, так что он должен сработать.

Комментарии:

1. итак, о чем именно вы спрашиваете?

2. спрашиваю, почему это не работает при использовании в контексте веб-страницы (а не CLI)

3. Бен прав: опубликованный мной код должен делать то, что я просил, но в php не работает, и я не знаю почему; если вы можете это исправить или опубликовать какое-то другое решение, пожалуйста, сделайте. В любом случае, я недавно обнаружил, что версия php, которую я использую (5.3.0), разблокирует ресурс в fclose (php > 5.3.2 больше этого не делает), я не знаю, может ли обновление исправить это.

Ответ №1:

Вы должны быть в состоянии решить эту проблему с помощью Gearman

Комментарии:

1. это расширение php, это не php-код; также мой код должен (теоретически) работать, но он не работает, поэтому, если кто-нибудь может сказать мне, почему он не работает, он уже идеален.