PHP-скрипты: быстродействие в примерах
Январь 15, 2008
Вчера столкнулся с задачей проверить валид 1 ляма доменов. Думал, все так просто — многопоточный форковый скрипт и запуск по крону...
Выбрал самый простой вариант — база данных. Однако, после запуска двух копий скрипта стало понятно — машина ложится...
После недолгих раздумий о причинах стало понятно, что выборка+апдейт одной записи из базы данных в таблице с 1 миллионом записей для mysql — задача непосильная...
Пришлось выпутываться так: разбил 1 миллион на равные группы, и сохранил каждую группу в отдельный файл (имя файла предполагает номер потока, ex. 1.txt / 2.txt и так далее).
Поскольку, я не был совсем уверен в надежности написанного скрипта и в том, что мой ноут выдержит такие безобразия — решил выкидывать каждый проверенный урл отдельно в файл, дабы иметь резервную копию проверенных доменов даже в случае сбоя системы.
Однако, понял, что такое проблема скорости работы файловой подсистемы.
Решил эту траблу блочной записью в файл... Здесь это — 50 доменов.
<?php
$process_id = $_GET['process_id'];
set_time_limit (0);
echo 'Обрабатываемый файл „bases/'.$process_id.'.txt“<br />';
echo 'Записываем в файл „result/'.$process_id.'.txt“<br />';
flush ();$fr = fopen ('bases/'.$process_id.'.txt', 'r');
$block_count = 0;
$str = '';while (!feof ($fr))
{
$domain = trim (fgets ($fr));
/// тут проверка домена и формирование строки записи $str.=xxx$block_count++;
if ($block_count == 50)
{ $fw = fopen ('result/'.$process_id.'.txt', 'a+');
fwrite ($fw,$str);
$str = '';
$block_count = 0;
}
}fclose ($fr);
?>
Может быть, кому-нибудь пригодится подобное безобразие