Erdekes problemaba botlottam tegnap.
Van egy phpben irt cron script, amit orankent futtatunk, de elofordulhat, hogy nagyon ritkan nem fejezodik be 1 ora alatt, es mivel egesz huzos sql query-k vannak benne (pontosabban maga a lekerdezes egyszeru, csak sok a sor) ezert ha 2 peldanyban fut, akkor eleg jol meg tudja fogni az adatbaziszervert.
ezert azt talaltam ki, hogy mikor elindul a scriptem, megnezi, hogy letezik-e egy bizonyos fajl, ha igen, akkor exit-tel kilep, ha nem letezik, akkor letrehozza, majd ha befejezodik a script (register_shutdown_function), akkor letorli.
Ez elmeletben szep es jo, de gyakorlatban a kovetkezot vettem eszre:
Ha elinditom a scriptet, majd nyomok egy frissitest, akkor szepen exitel, mivel fut mar egy peldany ("ignore_user_abort Off").
viszont ha elinditom egy tabban a sciptet, majd nyitok egy uj tabot, es ott is elinditom, akkor nem lep ki.
addig debugoltam, mig rajottem a problemara:
ha van egy nyitott kapcsolatom az adott url-re akkor ha nyitok megegyet, akkor a 2. peldany is ugyanazt a kimenetet kapja meg mint az elso.
Tehat nem fut le ket peldanyban a script, hanem mind2 ablakban ugyanazt a kimenetet latom (teszteleshez aktualis datumokat echoztam, es hiaba inditottam 10 sec elteressel, ugyanazt a scriptet, ugyanazokat a datumokat irta ki, valamint maga a cron script is hibat kellett volna hogy dobjon, unique key megsertese miatt, mikor egyszerre futott, de nem tette.)
a cron script szempontjabol ez nem problema, de kivancsi lennek, hogy ezt mi okozza, vagy hol lehetne ennek utanaolvasni.
Google-t probaltam, de valahogy nem tudom, hogy mik lennenek a megfelelo kulcsszavak ehhez a problemahoz.
Nekem gyanus, hogy ez valami apache beallitas/feature.
Ha valaki meg tudna dobni egy linkkel, akkor azt nagyon megkoszonnem.
<?php
error_reporting(E_ALL ^ E_NOTICE);
ini_set('display_errors', 1);
$lockfile = getcwd().'/locked';
$datefile = getcwd().'/'.date('Y-m-d H:i:s');
clearstatcache();
touch($datefile );
if (is_file($lockfile)) {
echo '<pre>'; print_r('letezik'); echo '</pre>';
die();
} else {
register_shutdown_function('shutdown');
echo '<pre>'; print_r('nem letezik'); echo '</pre>';
touch($lockfile);
chmod($lockfile, 0777 );
}
echo '<pre>'; print_r(date('Y-m-d H:i:s')); echo '</pre>';
sleep(19);
echo '<pre>'; print_r(date('Y-m-d H:i:s')); echo '</pre>';
function shutdown(){
global $lockfile;
echo '<pre>'; print_r($lockfile); echo '</pre>';
unlink($lockfile);
die();
}
?>
Tyrael
- 864 megtekintés
Hozzászólások
Üdvelet!
Nézd meg úgy, hogy a php-t így kezded.
header("Expires: Sat, 01 Jan 2000 1:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Cache-Control: post-check=0, pre-check=0");
- A hozzászóláshoz be kell jelentkezni
ha jól értettem semmi webes megjelenést stb. nem végez a script, hanem cron -ból mint lokál dolgokat végző cumó van meghívva -> semmi jelentősége a header bejegyzéseknek
- A hozzászóláshoz be kell jelentkezni
annyi megjelenest csinal, hogy debug uzeneteket echoz, de header szerintem sem problema, mert dinamikus scripteket amugy sem cachelhet a bongeszo(mivel last modified mezoben mindig az aktualis idopontot adja vissza talan...).
Tyrael
- A hozzászóláshoz be kell jelentkezni
kapcsold ki a bongeszodben a pipelinet mig debugolsz :)
- A hozzászóláshoz be kell jelentkezni