Кажется, у меня странная проблема при попытке запустить pthreads
в php. В настоящее время я пытаюсь использовать потоки для управления дополнительными вызовами других PHP-скриптов, но моя программа преждевременно завершает работу всякий раз, когда я пытаюсь использовать Mutex::unlock
, Я пытался переустановить разные версии 64-битных pthreads
а также проверенные примеры (из которых mutex
Вот работает ). Я думаю, что это может быть проблема с popen. Кто-нибудь сталкивался с этой ошибкой раньше или знает хороший способ ее отладки?
Код, который я использую, выглядит следующим образом:
<?php
class lockedThread extends Thread {
public function __construct($func, $megalog, $mutex){
$numargs = func_num_args();
$this->megalog = $megalog;
$this->func = $func;
if ($numargs == 3) {
$this->mutex = array($mutex);
} else {
$arg_list = func_get_args();
$this->mutex = array_slice($arg_list, 2);
}
}
public function run() {
echo "Beginning " . $this->func . " \n";
for ($i = 0; $i < count($this->mutex); $i++) {
$locked = Mutex::lock($this->mutex[$i]);
while($locked == false) {
sleep(0.5);
$locked = Mutex::lock($this->mutex[$i]);
}
printf($this->getThreadId() . " acquired lock " . $this->mutex[$i] . "\n");
}
$this->res = popen("php Functions/" . $this->func . ".php". " >> logs/" . $this->func . ".log", 'r');
printf("closing " . $this->func . ": " . pclose($this->res) . "\n");
for ($i = count($this->mutex) - 1; $i >= 0; $i -= 1) {
printf($this->getThreadId() . " attempting to release lock " . $this->mutex[$i] . "\n");
Mutex::unlock($this->mutex[$i]);
echo $this->getThreadId() . " released lock " . $this->mutex[$i] . "\n";
}
echo "really closing " . $this->func . "\n";
}
}
}
// Create the mutex. Note, the connections mutex will always come first
$connMutex = Mutex::create(true);
$eventMutex = Mutex::create(true);
$workers["checkRecurrence"] = new lockedThread("checkRecurrence", $megalog, $eventMutex);
$workers["checkRecurrence"]->start();
echo "checkRecurrence is " . $workers["checkRecurrence"]->getThreadId() . "\n";
$workers["checkDeletion"] = new lockedThread("checkDeletion", $megalog, $eventMutex);
$workers["checkDeletion"]->start();
echo "checkDeletion is " . $workers["checkDeletion"]->getThreadId() . "\n";
echo "Unlocking conn: " . Mutex::unlock($connMutex) . "\n";
echo "Unlocking event: " . Mutex::unlock($eventMutex) . "\n";
foreach($workers as $i=>$worker) {
echo "Joining $i \n";
while ($worker->join() === false) {
echo "Attempt of $i \n";
}
echo "Joined $i \n";
}
sleep(1);
echo "Finishing destruction of workers!\n";
/* please remember to destroy mutex and condition variables */
Mutex::destroy($connMutex);
Mutex::destroy($eventMutex);
Логи, которые я получаю:
"C:\wamp\bin\php\php5.5.12\php.exe" "C:\wamp\www\hang\PHPAutomation\index.php"Beginning checkRecurrence
checkRecurrence is 8576
Beginning checkDeletion
checkDeletion is 9144
Started all workers
Unlocking conn: 1
Unlocking event: 1
Joining checkRecurrence
8576 acquired lock 52687024
closing checkRecurrence: 0
8576 attempting to release lock 52687024
Done.
Задача ещё не решена.
Других решений пока нет …