Во-первых..
Нет, это не настоящие потоки согласно определениям CS, но вы действительно не заметите разницу. Я скажу так: эта библиотека ближе к ощущению настоящей резьбы, чем новая котлета для гамбургера McDonald's «McPlant» к говядине. ?
Если вы похожи на меня, вы любите PHP! Вы любите гибкость и мощь языка — свободу писать небрежный код (я не защищаю это, но я буду защищать до смерти право писать небрежный код) или создавать бесспорно красивые произведения логического искусства! Теперь для всех моих программистов на C (и, я думаю, на C++) у вас есть библиотека, которая не только по-настоящему продемонстрирует мощь PHP, но и придаст импульс вашему следующему проекту!
Эта библиотека позволяет очень эффективно распараллеливать процессы, что очень похоже на многопоточность POSIX. Вы можете совместно использовать глобальные переменные между всеми phpthreads , передавать значения/объекты/массивы в PHPTHread при создании, легко обмениваться значениями/объектами/массивами между запущенными phpthreads и получать выходные значения/объекты/массивы PHPThread, когда каждый PHPThread завершается через phpthread_join()
семейство функций.
Я разработал эту библиотеку, потому что хотел написать высокопроизводительный сервер WebSocket, который мог бы легко обрабатывать тысячи одновременных подключений, через которые можно было бы быстро передавать большие объемы данных (например, изображений или видео). Да, по сути, это сервер с функцией fork()
, но верхний слой PHPThread делает его очень простым в развертывании, обеспечивая при этом механизм для простого (и многопоточного) IPC. Я мог бы использовать C и получить более высокую производительность, но мне он показался более портативным и простым в развертывании по мере развертывания серверов, так что теперь вот оно.
Для вас, более технических специалистов, эта библиотека не ограничена временными ограничениями из-за необходимости использования «тиков». Это часть того, что делает его таким быстрым. Библиотека использует внутренние сигналы (например, SIGUSR1 и SIGUSR2) для прерывания выполнения и очень плавного переключения контекста. Да, мы используем SIGUSR1 и 2, поэтому, если ваш проект использует эти сигналы, рассмотрите возможность использования phpthread_send_message()
для назначенной функции обработчика сообщений (см. примеры/messages1.php и примеры/messages2.php). Он должен полностью соответствовать вашим целям.
Есть примеры, которые вы можете запустить в каталоге «examples». Не стесняйтесь размещать shebang для облегчения выполнения или запускать их, добавляя к ним префикс php <filename>
. Я еще не завершил их все, но я закончил немало из них. По крайней мере, достаточно, чтобы получить хорошее представление о возможностях.
Для phpthreads требуются следующие расширения PHP:
<?php
require_once '../lib/phpthread.php'; /* Use correct path! */
function thread_proc( $thread,
$param)
{
echo "nt[PHPTHREAD] - I've started and have a param: "" . print_r($param, true) . ""!n";
for ($i = 0; $i < 15; $i++) {
usleep(1000000);
echo "t[PHPTHREAD] - Tick!n";
}
$myobj = (object)array(
'seconds_alive'=>$i,
'lucky_number'=>rand(0, 10000)
);
echo "nt[PHPTHREAD] - I'm returning this:n";
print_r($myobj);
echo "n";
echo "<--------------------------------------->nn";
return $myobj;
}
$id = phpthread_create($phpthread, array(), "thread_proc", null, array("this awesome string!"));
for ($i = 0; $i < 5; $i++) {
echo "n[MAIN] - Doing my thing...n";
usleep(1000000);
}
echo "n[MAIN] - Okay, I'm tired. Waiting on child to quit.n";
phpthread_join($id, $retval);
echo "n[MAIN] - Child is done. It returned:n";
print_r($retval);