Комментарии 16
тут надо тоже объяснить читателям в каких целях такой мультитридинг подходит. для сетевых соединений -> плодить процессы будет слишком жирно. а для других целей вполне оправдано.
> Это сам класс, реализующий триды (потоки) и позволяющий этим потокам и родителю обмениваться переменными
Так как используете popen, то это вовсе не триды (thread), а отдельные процессы (fork). Очень уж оно ресурсоемкое, хотя для ряда задач и может быть оправдано, например, для каких-либо грабберов-парсеров, запускаемых с командной строки.
А вообще отличная реализация, кстати можно было бы не только файловую систему использовать, но и shared memory, или memcached — по ситуации.
Так как используете popen, то это вовсе не триды (thread), а отдельные процессы (fork). Очень уж оно ресурсоемкое, хотя для ряда задач и может быть оправдано, например, для каких-либо грабберов-парсеров, запускаемых с командной строки.
А вообще отличная реализация, кстати можно было бы не только файловую систему использовать, но и shared memory, или memcached — по ситуации.
Хорошо, спасибо за совет. Я попробую доработать систему с испльзованием SharedMemory.
По сути Вы правы, это не триды, а форки. Но реализация такова, что эти форки управляются как триды. Была задача реализовать именно так. Но всеравно спасибо за совет, поправлю.
Хотя у меня есть и минус в сторону Shared Memory — для того, что бы ее использовать нужно скомпилировать ПХП с параметром -smop, что недопустимо в моей ситуации.
Моя основная задача была разработать систему проверки ссылок. Причем эта система должна была отрабатывать максимально быстро и запускаться как страница. То есть при заходе клиента из браузера на страницу ему должно было вывестись сообщение с просьбой об ожидании и в это время начиналась проверка ссылок. Естественно, в один поток это очень долго. Для этого нужно использовать много потоко (триды, форки). Но так как PCNTL невозможен в условиях mod_php пришлось делать так как есть. Хостинг я использую чужой, что не позволяет мне попросить админов перекомпилировать пхп со всеми нужным мне параметрами.
В итоге мы имеем систему с минимальными требованиями к модулям.
По сути Вы правы, это не триды, а форки. Но реализация такова, что эти форки управляются как триды. Была задача реализовать именно так. Но всеравно спасибо за совет, поправлю.
Хотя у меня есть и минус в сторону Shared Memory — для того, что бы ее использовать нужно скомпилировать ПХП с параметром -smop, что недопустимо в моей ситуации.
Моя основная задача была разработать систему проверки ссылок. Причем эта система должна была отрабатывать максимально быстро и запускаться как страница. То есть при заходе клиента из браузера на страницу ему должно было вывестись сообщение с просьбой об ожидании и в это время начиналась проверка ссылок. Естественно, в один поток это очень долго. Для этого нужно использовать много потоко (триды, форки). Но так как PCNTL невозможен в условиях mod_php пришлось делать так как есть. Хостинг я использую чужой, что не позволяет мне попросить админов перекомпилировать пхп со всеми нужным мне параметрами.
В итоге мы имеем систему с минимальными требованиями к модулям.
>Моя основная задача была разработать систему проверки ссылок. Причем эта система должна была отрабатывать максимально быстро и запускаться как страница.
А разве curl_multi_* не лучше использовать в данном случае?
php.net/manual/ru/function.curl-multi-exec.php
А разве curl_multi_* не лучше использовать в данном случае?
php.net/manual/ru/function.curl-multi-exec.php
Поверьте, вы неправы. Невозможно использовать curl_multi.
А почему?
Кроме того есть еще неблокирующий режим чтения для сокетов.
php.net/manual/en/function.stream-set-blocking.php
Кроме того есть еще неблокирующий режим чтения для сокетов.
php.net/manual/en/function.stream-set-blocking.php
Как бы Вам объяснить… Просто загрузить данные по ссылкам в несколько потоков — недостаточно…
Нам надо помимо всего еще и, допустим, записывать данные в БД или выбирать по хоу выполнения какие-либо действия.
В любом случае курл_мульти_экзек — делает несколько запросов курла одновременно. Но нам то это и как раз не нужно! Нша задача — реализовать много потоков, выполняющих, возможно, даже, разный код!
В любом случае Ваше решение здесь неприемлимо.
Если бы надо было просто загрузить несколько ссылок или скачать файл многопоточно — Ваше предложение очень даже к месту было бы, но сейчас оно не подходит.
Нам надо помимо всего еще и, допустим, записывать данные в БД или выбирать по хоу выполнения какие-либо действия.
В любом случае курл_мульти_экзек — делает несколько запросов курла одновременно. Но нам то это и как раз не нужно! Нша задача — реализовать много потоков, выполняющих, возможно, даже, разный код!
В любом случае Ваше решение здесь неприемлимо.
Если бы надо было просто загрузить несколько ссылок или скачать файл многопоточно — Ваше предложение очень даже к месту было бы, но сейчас оно не подходит.
а почему именно UNIX? в реализации нет ничего, относящегося именно к юниксу, кроме путей (которые можно вынести в конфиги или константы)
Полностью согласен, на за Windows я уже очень давно (с года 99 ) нормально не сидел (только если в инет зайти, не больше ). И, поэтому, я без понятия как там теперь с правами пользователей, можно ли создать темповой директори и где ее найти… Если подскажите, то я доделаю и под Windows, разумеется, с автоопределением ОСи.
временную директорию можно создать где угодно, например: 'C:\Temp'.
с правами пользователей в винде даже полегче, в большинстве случаев, думаю, создать и считать файл будет не проблема.
с правами пользователей в винде даже полегче, в большинстве случаев, думаю, создать и считать файл будет не проблема.
Смотря для каких целей нужен Threading, если для работы с сокетами, то можно использовать curl_multi_exec, на vingrad.ru где то год назад поднималась эта тема, и есть готовое решение Google Code — Downloader
И это решение можно использовать не только для работы с сокетами, немножко не правильно высказался, еспользую многопоточность curl_multi_exec вызывает наш скрипт, который должен выполняться, и получаем что-то на псевдо поточности.
И это решение можно использовать не только для работы с сокетами, немножко не правильно высказался, еспользую многопоточность curl_multi_exec вызывает наш скрипт, который должен выполняться, и получаем что-то на псевдо поточности.
И спасибо всем за карму. Перенес топик в блог PHP.
С вашим решением одна проблема — запуск интерпретатора PHP — дорогостоящая операция.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Еще одна реализация многопоточности на PHP