Одним из способов организовать возможность сохранения данных для нескольких запускаемых копий одного PHP-скрипта, являются файлы, уникальные для каждого IP-адреса и каждого потока закачки с него. Разместим в папке нашего скрипта подпапку с названием lock и при подключении каждого IP-адреса будем создавать в ней папки с именем соответствующим этому IP.
Для каждого потока закачки файлов мы будем создавать в этих папках файлы нулевого размера. Т.е. если с адреса 192.168.0.1 у нас качается два файла, то в соответствующей папке (lock/192.168.0.1) у нас будут находится два файла 1 и 2.
Код требуемых нам функций thread_number(), thread_start() и thread_stop() будет следующим.
Функция thread_number()
// Эта функция возвращает номер текущего потока для данного IP-адреса function thread_number(){ // Задаем имя папки для размещения файлов отмечающих каждый поток // В папке lock каждому IP-адресу будет соответствовать папка с именем равным IP $lock_dir='./lock/'.$_SERVER['REMOTE_ADDR']; // Очищаем кэш файловых операций clearstatcache(); // Если папка не существует (закачка с данного IP еще не производилась), то создаем ее // с правами на полный доступ if(!is_dir($lock_dir)){ mkdir($lock_dir); chmod($lock_dir,0777); } // Получаем список файлов в папке $files=scandir($lock_dir); // Поскольку даже в пустой папке присутствуют два системных имени: // "." - текущая папка и ".." - родительская папка, то удаляем их из списка array_shift($files); array_shift($files); // Возвращаем количество файлов. Это и будет номер текущего потока запущенного с IP-адреса returncount($files); }
Функция thread_start()
// Эта функция, запускаемая при начале скрипта, будет отмечать каждый поток, для каждого IP-адреса functionthread_start(){ // Задаём имя файла для отметки текущего потока. // Он будет на единицу больше числа возвращаемого функцией thread_number() $lock_file='./lock/'.$_SERVER['REMOTE_ADDR'].'/'.(thread_number()+1); // Эти две функции создадут нам файл нулевого размера. $f=fopen($lock_file,'w'); fclose($f); // Выставляем права на файл для его беспрепятственного удаления в конце работы скрипта chmod($lock_file,0777); }
Функция thread_stop()
// Эта функция удаляет файл отмечающий данный поток для данного IP-адреса или всю папку function thread_stop(){ // Задаем имя папк, где размещены файлы отмечающих каждый поток для текущего IP. $lock_dir='./lock/'.$_SERVER['REMOTE_ADDR']; // Получаем номер текущего скрипта. В силу того, что для любого его запуска создается свой файл // эта величина всегда будет больше единицы $number= thread_number(); if($number==1){ // При завершении единственного скрипта, запущенного с данного IP будут удалены и папка и файл unlink($lock_dir.'/'.$number); rmdir($lock_dir); } elseif($number>1){ // Если кроме нашего скрипты запущены другие его копии с этого же IP, удаляем только файл unlink($lock_dir.'/'.$number); } else{ // Данная ситуация невозможна при корректной работе скрипта, но все равно отследим ее. // Если в папке нет ни одного файла, просто удаляем папку. rmdir($lock_dir); } }
Далее рассмотрим способ сохранения информации о текущих закачках в базе данных MySQL.