Реализация многопоточности в PHP? Когда вы видите этот заголовок, вы, должно быть, думаете, что я сумасшедший... Но на самом деле я действительно это делаю.
Вот
некоторые из моих проверенных методов. Это действительно возможно.
что сам PHP не поддерживает многопоточность, но наш веб-сервер поддерживает многопоточность.
Другими словами, к нему могут обращаться несколько человек одновременно. Это также является основой для реализации многопоточности в PHP. Предположим
, что сейчас мы запускаем файл a.php. Но я также прошу веб-сервер запустить в программе еще один файл b.php
,поэтому оба файла будут выполнены одновременно
(PS: после запроса ссылки
.отправляется, WEB-сервер выполнит его независимо от того, вышел ли клиент )
Иногда мы хотим запустить не другой файл, а часть кода в этом файле. Что же нам делать
? может использовать параметры для управления запуском программы a.php.
Вот пример:
//a .php.
PHP-код: ----------------------------------------------- - ----------------------------------
<?php
функция runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn" //Второй параметр здесь — заголовок запроса, указанный в протоколе HTTP
//Если вы не понимаете, посмотрите определение в RFC
fclose($fp);
}
функция а()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
функция б()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
запуститьПоток();
а();
}
иначе if($_GET['act'] == 'b') b();
?>
------------------------------------------------ --------------------------------
Откройте result_a.log и result_b.log и сравните время доступа к двум файлам. Вы обнаружите, что эти два файла действительно работают в разных потоках.
Некоторые времена абсолютно одинаковы.
Вышеупомянутый пример — это простой пример, и вы можете улучшить его, придав ему другие формы.
Теперь, когда в PHP доступна многопоточность, возникает проблема, то есть синхронизации. Мы знаем, что сам PHP не поддерживает многопоточность. Так
что же делать? 1.
Старайтесь не обращаться к одному и тому же ресурсу, чтобы избежать конфликтов. Но вы можете работать с базой данных одновременно. Поскольку база данных поддерживает параллельные операции,не записывайте данные в один и тот же файл
в многопоточном PHP
. хотите писать, используйте другие методы синхронизации. Например, вызовите flock для блокировки файла и т. д. Или создайте временный файли дождитесь исчезновения файла в другом потоке while(file_exits('xxx')); эквивалентно: Когда этот временный файл существует, это означает, что поток действительно работает
. Если такого файла нет, это означает, что его освободили другие потоки.
2. Старайтесь не читать данные из этого сокета после того, как runThread выполнит fputs. добиться многопоточности, необходим неблокирующий режим. То есть он возвращается сразу при использовании функции
типа
fgets . Поэтому при чтении и записи данных будут проблемы. не является многопоточным. Перед выполнением необходимо дождаться указанного выше возврата.Итак, если вам нужно обменяться данными, вы, наконец, можете использовать внешние файлы или данные для его завершения. Если вы действительно этого хотите, используйте сокет_set_nonblock(. $fp), чтобы добиться этого.
Сказав так много, имеет ли это какое-либо практическое значение? Когда необходимо использовать этот метод?
Как мы все знаем, в приложении, которое постоянно считывает сетевые ресурсы, скорость сети является узким местом. приняв этот метод, вы сможете
читать разные страницы с несколькими потоками одновременно.
Я создал программу, которая может искать информацию на веб-сайтах торговых центров, таких как 8848 и soaso. Также существует программа, которая считывает деловую информацию и каталоги компаний с сайта Alibaba и тоже использует
эту технологию. Потому что обеим программам приходится постоянно подключаться к своим серверам, чтобы читать информацию и сохранять ее в базе данных. Использование этой технологии исключает необходимость ожидания ответа.