Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
posix_kill($this->getPID(), 9);
ini_set("max_execution_time", "0");
ini_set("memory_limit", "-1");
ob_implicit_flush();
define("IS_WIN", (stristr(php_uname('s'), 'windows')==FALSE)?false:true);
function gen_log_subdir() {
$tmv=time();
return sprintf('%08X_', $tmv).date("dmY_His", $tmv);
}
function check_log_subdir($tsize=100000000) {
$root=$this->log_dir.$this->log_subdir;
$res=0;
if ($dir = @opendir($root)) {
while (($file = @readdir($dir)) !== false) {
$fn=$root.$file;
if (is_file($fn)) {
$res+=@filesize($fn);
if ($res>$tsize) break;
}
}
@closedir($dir);
}
$this->log_add=sprintf('%10u', $res);
return ($res<$tsize);
}
function get_log_subdir() {
$suf=($this->log_subdir=='')?'_':'';
while ($this->log_subdir=='' || !$this->check_log_subdir()) {
$this->log_subdir=$this->gen_log_subdir().$suf.'/';
}
$lsd=$this->log_dir.$this->log_subdir;
if (!file_exists($lsd)) mkdir($lsd);
return $this->log_subdir;
}
function log_subdir() {
return $this->log_dir.$this->get_log_subdir();
}
function print_log($str) {
$this->log_file=$this->log_subdir()."daemon.log";
$fp = @fopen ($this->log_file, "ab");
if (!$fp) return false;
if (@flock($fp, LOCK_EX)) {
if ($str!='') $str=date("[d-m-y H:i:s] ").'['.$this->log_add.']'.$str;
fputs ($fp, $str."\n");
@flock($fp, LOCK_UN);
} else {
@fclose ($fp);
return false;
}
@fclose ($fp);
return true;
}
4EC2691D_15112011_162901_
4EC67040_18112011_174832
4ECCC14D_23112011_124757
4ED24B49_27112011_173801
4EDD37F5_06122011_003029
4EE1ACA0_09122011_093720
4EE71107_13122011_114703
4EEC5EEC_17122011_122044
4EF086F2_20122011_160034
4EF33912_22122011_170506
4EF73ED1_25122011_181841
4EF9AC85_27122011_143117
4EFBBD1F_29122011_040639
4EFDD4F1_30122011_181249
4F02CB36_03012012_123238
4F09DBA9_08012012_210841
4F0ED584_12012012_154348
4F15046A_17012012_081730
4F1A7124_21012012_110244
4F1FA0B1_25012012_092657
4F24ECC9_29012012_095257
4F28E8F9_01022012_102545
4F2E7DBE_05022012_160150
4F32BCD4_08022012_212004
4F3810BF_12022012_221927
4F3CD2EE_16022012_125702
4F42007B_20022012_111243
4F475F9E_24022012_125958
4F4C8C59_28022012_111209
4F50E0EB_02032012_180203
4F55E8A6_06032012_133622
4F5739F0_07032012_133528_
4F5754EA_07032012_153034
4F5B9B13_10032012_211859
4F5CEAAB_11032012_211051
4F6192AD_15032012_095645
...
$daemon->print_log("alarm! very important tcp-client connected") ;
А там оно само разбирается, в какой лог в какой поддиректории писать.[04-06-12 15:43:00] [ 19410][check_logged_in 1CE9020C55E72313CD0EDEF5E3AC3058] :KEY_9
[04-06-12 15:43:00] [ 24273][db_set_value 1CE9020C55E72313CD0EDEF5E3AC30585F1A34060BD5|confirmed|1] :KEY_9
[06-04-12 15:43:00] received from 192.168.50.18:3060 [KEY_9]:
0x00000000 2A 00 00 37 00 00 00 01 00 00 00 00 00 00 00 00 *..7............
0x00000010 04 00 00 0F 63 68 65 63 6B 5F 6C 6F 67 67 65 64 ....check_logged
0x00000020 5F 69 6E 04 00 00 20 31 43 45 39 30 32 30 43 35 _in....1CE9020C5
0x00000030 35 45 37 32 33 31 33 43 44 30 45 44 45 46 35 45 5E72313CD0EDEF5E
0x00000040 33 41 43 33 30 35 38 3AC3058
Data:
array (
0 => 'check_logged_in',
1 => '1CE9020C55E72313CD0EDEF5E3AC3058',
)
[06-04-12 15:43:00] sended to 192.168.50.18:3060 [KEY_9]:
0x00000000 2A 9B 00 0C 00 00 00 01 00 00 00 00 00 00 00 00 *›..............
0x00000010 02 00 00 02 00 C8 04 00 00 02 4F 6B .....И....Ok
Data:
array (
0 => 200,
1 => 'Ok',
)
[06-04-12 15:43:00] received from 192.168.50.18:3060 [KEY_9]:
0x00000000 2A 00 00 52 00 00 00 01 00 00 00 00 00 00 00 00 *..R............
0x00000010 04 00 00 0C 64 62 5F 73 65 74 5F 76 61 6C 75 65 ....db_set_value
0x00000020 04 00 00 2C 31 43 45 39 30 32 30 43 35 35 45 37 ...,1CE9020C55E7
0x00000030 32 33 31 33 43 44 30 45 44 45 46 35 45 33 41 43 2313CD0EDEF5E3AC
0x00000040 33 30 35 38 35 46 31 41 33 34 30 36 30 42 44 35 30585F1A34060BD5
0x00000050 04 00 00 09 63 6F 6E 66 69 72 6D 65 64 04 00 00 ....confirmed...
0x00000060 01 31 .1
Data:
array (
0 => 'db_set_value',
1 => '1CE9020C55E72313CD0EDEF5E3AC30585F1A34060BD5',
2 => 'confirmed',
3 => '1',
)
[06-04-12 15:43:00] sended to 192.168.50.18:3060 [KEY_9]:
0x00000000 2A E3 00 17 00 00 00 01 00 00 00 00 00 00 00 00 *г..............
0x00000010 02 00 00 02 00 C8 06 00 00 0D 04 00 00 02 49 44 .....И........ID
0x00000020 02 00 00 03 01 09 98 ......
Data:
array (
0 => 200,
1 =>
array (
'ID' => 67992,
),
)
function check() {
$pid = $this->read_pid();
if ($pid>0 && posix_kill($pid, 0)) return true;
return false;
}
function sig_handler($signo) {
$func=$this->term_func;
switch ($signo) {
case SIGTERM:
// handle shutdown tasks
$this->daemon_del_pid();
exit;
break;
case SIGHUP:
// handle restart tasks
break;
default:
// handle all other signals
}
if ($func) $func($signo);
}
for ($i=1;$i<=SIGTERM;$i++) @pcntl_signal($i, SIG_IGN);
getmypid()). По окончании всех действий удаляем запись с нашим pid (в случае демона этого делать не надо, ведь мы считаем, что этот процесс всегда должен быть запущен).(bool) posix_getsid($pid); Ну и дальше действовать по ситуации.posix_getsid() использовать exec('ps'); с дополнительными параметрами и смотреть не только pid, но еще и имя запущенного процесса.Если сервер перезагрузился, процесс аварийно завершился, упал php или еще один из миллиона вариантов катастроф, но при этом файл не был удален, то просто напросто новая копия демона не запуститься. это не теория, сам сталкивался с этим.знакомая ситуация, существование pid проверяем из /proc/
Класс для реализации UNIX-демонов на PHP