Einige PHP-Cron-Jobs sind kürzlich auf einem gemeinsam genutzten Server fehlgeschlagen. Sie hatten fast ein Jahr lang fehlerfrei und ohne Updates gearbeitet, konnten aber aufgrund von Syntaxfehlern nicht mehr ausgeführt werden. Was ist passiert?
Es stellte sich heraus, dass diese Skripte plötzlich unter PHP 4 und nicht unter PHP 5 ausgeführt wurden. Unter / usr / local / bin / php ist eine Version von PHP 4 installiert, aber dies war die "shebang" -Zeile in diesen Skripten:
#!/usr/local/php5/bin/php
Ich habe einige Experimente gemacht:
% /usr/local/php5/bin/php --version
PHP 5.2.6 (cli) (built: May 11 2008 13:09:39)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies
% echo '<?= phpversion() ?>' | /usr/local/php5/bin/php
5.2.6
% printf '#!/usr/local/php5/bin/php\n<?= phpversion() ?>' > version
% chmod +x version
% ./version
5.2.6
% mv version x.php
% ./x.php
4.4.9
Ich wusste nicht, dass Linux Dateierweiterungen Shebang-Zeilen überschreiben lassen würde, aber das sehe ich. Der Support des Hosting-Unternehmens hatte keine Ahnung, warum dies geschah (oder was sich kürzlich geändert hatte, um dies zu ermöglichen). Daher ging ich mit einer Problemumgehung vor: Benennen Sie die Skripte um, damit sie nicht mehr mit ".php" enden.
Die Cron-Jobs werden wieder ausgeführt, aber ich hasse die Antwort "Tu das einfach nicht". Ich bin wirklich neugierig zu wissen, woher dieses Verhalten kommt, weil ich so etwas noch nie von * nix auf Shell-Ebene gesehen habe. Ich habe sowohl unter zsh als auch unter bash getestet, daher glaube ich nicht, dass ich eine Shell-Konfiguration beschuldigen kann. Ich suchte nach 'php' unter / etc, um zu sehen, ob mir das irgendwelche Hinweise geben würde, aber nein. Irgendwelche Ideen?