x00xer
Новичок
Unix Sockets для IPC
Здравствуйте, у меня есть срочная задача состоит она в следующем -
мне нужно параллельно выполнить пару задач
Т.е. скрипт запускается делает двух детей которые идут делать дело, а после того все сделали отдают отцу наделанное
.
вот код (с миру по нитке так сказать
В результате этого скрипта в $data = $manager->run(); Я получаю результат только одного детеныша
пробывал через System V IPC сообщение тоже самое получае только результат одного...
В какую сторону смотреть то ? Как решить проблему ?
Скрипт запускаю из консоли и CGI окружения
Здравствуйте, у меня есть срочная задача состоит она в следующем -
мне нужно параллельно выполнить пару задач
Т.е. скрипт запускается делает двух детей которые идут делать дело, а после того все сделали отдают отцу наделанное
.вот код (с миру по нитке так сказать
PHP:
error_reporting(E_ALL & E_NOTICE);
class Task {
protected $pid;
protected $ppid;
function __construct(){
}
function fork($socket){
$pid = pcntl_fork();
if ($pid == -1)
throw new Exception ('fork error on Task object');
elseif ($pid) {
# we are in parent class
$this->pid = $pid;
} else{
# we are is child
$this->run($socket);
}
}
function run(){
$this->ppid = posix_getppid();
$this->pid = posix_getpid();
}
# call when a task in finished (in parent)
function finish(){
// echo "task finished {$this->pid}\n";
}
function pid(){
return $this->pid;
}
}
class asd extends Task
{
function __construct($what)
{
}
function run($msgqueue){
parent::run();
$result = array("child2" => "asdzxcasd");
if(socket_write($msgqueue, serialize($result), strlen(serialize($result))) === false)
echo "socket_write() failed. Reason: ".socket_strerror( socket_last_error($msgqueue)));
exit(0);
}
}
class qwe extends Task{
function __construct()
{
}
function run($msgqueue)
{
parent::run();
$result = array('child1' => 'qweasd');
if(socket_write($msgqueue, serialize($result), strlen(serialize($result))) === false)
throw new Exception("socket_write() failed. Reason: ".socket_strerror( socket_last_error($msgqueue)));
exit(0);
}
}
class TaskManager{
protected $pool;
function __construct(){
$this->pool = array();
}
function add_task($task){
$this->pool[] = $task;
}
function run(){
$data = array();
$sockets = array();
if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $sockets) === false)
echo "socket_create_pair failed. Reason: ".socket_strerror(socket_last_error());
foreach($this->pool as $task){
$task->fork($sockets[0]);
}
while(1){
$pid = pcntl_wait($extra);
if($pid == -1)
break;
}
if(($data = socket_read($sockets[1], 200000, PHP_BINARY_READ)) === false)
{
echo 'error!';
}
return unserialize($data);
}
function finish_task($pid){
if($task = $this->pid_to_task($pid))
$task->finish();
}
function pid_to_task($pid){
foreach($this->pool as $task){
if($task->pid() == $pid)
return $task;
}
return false;
}
}
// start application
function main()
{
$manager = new TaskManager(); // create task manager
...
$manager->add_task(new qwe());
$manager->add_task(new asd());
$data = $manager->run();
}
main();
пробывал через System V IPC сообщение тоже самое получае только результат одного...
В какую сторону смотреть то ? Как решить проблему ?
Скрипт запускаю из консоли и CGI окружения

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