Очередь на php
Как сделать очередь FIFO? В очереди строки. Один скрипт добавляет строку сверху, второй - снимает снизу. Скрипты могут запуститься кроном одновременно. Достаточно ли текстового файла или нужен mysql?
Ну да ладно. А в чём проблема-то? В том, что два скрипта могут запуститься одновременно? Ну, во-первых, совсем не факт, что они одновременно будут использовать файл. А во-вторых, когда одним процессом файл занят, второй будет его ожидать. Так что, делай и не волнуйся.
А так всё просто:
Код:
<?php
// То, что нужно обоим скриптам. Назовём его FIFO.php
define ("FIFO_NAME", "fifo.txt");
define ("STRING_DELIMITER", "\n");
if (!file_exists(FIFO_NAME)){
file_put_contents(FIFO_NAME, "");
}
function prer(array $arr){
echo "<pre>";
print_r($arr);
echo "<pre>";
}
function append_fifo_item(&$fa, $str){
array_push($fa, $str);
}
function remove_fifo_item(&$fa){
array_shift($fa);
}
?>
// То, что нужно обоим скриптам. Назовём его FIFO.php
define ("FIFO_NAME", "fifo.txt");
define ("STRING_DELIMITER", "\n");
if (!file_exists(FIFO_NAME)){
file_put_contents(FIFO_NAME, "");
}
function prer(array $arr){
echo "<pre>";
print_r($arr);
echo "<pre>";
}
function append_fifo_item(&$fa, $str){
array_push($fa, $str);
}
function remove_fifo_item(&$fa){
array_shift($fa);
}
?>
Код:
<?php
require_once("FIFO.php");
if(is_file(FIFO_NAME) && is_writable(FIFO_NAME) && is_readable(FIFO_NAME)){
$fifo_array = file(FIFO_NAME);
append_fifo_item($fifo_array, date("r") . STRING_DELIMITER);
file_put_contents(FIFO_NAME, $fifo_array);
}
clearstatcache();
prer($fifo_array);
?>
require_once("FIFO.php");
if(is_file(FIFO_NAME) && is_writable(FIFO_NAME) && is_readable(FIFO_NAME)){
$fifo_array = file(FIFO_NAME);
append_fifo_item($fifo_array, date("r") . STRING_DELIMITER);
file_put_contents(FIFO_NAME, $fifo_array);
}
clearstatcache();
prer($fifo_array);
?>
Код:
<?php
require_once("FIFO.php");
if(is_file(FIFO_NAME) && is_writable(FIFO_NAME) && is_readable(FIFO_NAME)){
$fifo_array = file(FIFO_NAME);
remove_fifo_item($fifo_array);
file_put_contents(FIFO_NAME, $fifo_array);
}
clearstatcache();
prer($fifo_array);
?>
require_once("FIFO.php");
if(is_file(FIFO_NAME) && is_writable(FIFO_NAME) && is_readable(FIFO_NAME)){
$fifo_array = file(FIFO_NAME);
remove_fifo_item($fifo_array);
file_put_contents(FIFO_NAME, $fifo_array);
}
clearstatcache();
prer($fifo_array);
?>
я там нарочито сделал вывод содержимого массива в браузер, чтобы было видно результат. в файле такая же ерунда.
Спасибо за кристальную простоту)) Да, можно и в одном скрипте написать. Не додумался сразу. А какие ограничения на размер текстового файла? Не будет ли это тормозить, ведь там весь файл считывается каждый раз целиком?
да, собственно, все просто. скрипт сожрет столько памяти (дополнительно) сколько у тебя занимает файл. вот и считай - сколько ты можешь поиметь памяти на сервере.
Цитата: mfender
И сами скрипты, запускаемые кроном.
я там нарочито сделал вывод содержимого массива в браузер, чтобы было видно результат. в файле такая же ерунда.
я там нарочито сделал вывод содержимого массива в браузер, чтобы было видно результат. в файле такая же ерунда.
Не понимаю, как вывести в браузер из скрипта, запущенного кроном?
А двумерный массив можно так же просто прочитать из текстового файла?
Цитата: varilke
Не понимаю, как вывести в браузер из скрипта, запущенного кроном?
А двумерный массив можно так же просто прочитать из текстового файла?
А двумерный массив можно так же просто прочитать из текстового файла?
вывод в браузер я сделал для демонстрации работы скрипта. уж куда и чего ты выводить будешь - твоё дело.
насчёт двумерного массива. можешь хоть какой массив писать в текстовый файл. но придумай как это сделать. самый простой способ - сериализованный массив (см. serialize() и unserialize())