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?
quelle
Antworten:
Klingt so, als hätten Sie PHP bei binfmt_misc registriert.
Schauen Sie sich die Manpage zum Thema an: binfmt_misc.txt
Sie möchten die Registrierung des PHP-Handlers binfmt_misc aufheben, indem Sie -1 darauf zurückgeben (muss root sein). Es wird in / proc / sys / fs / binfmt_misc / aufgeführt, wenn dies Ihr Problem ist.
Als Warnung könnte dies andere Dinge im System beschädigen. Zum Beispiel, wenn ein anderes PHP-Skript ausgeführt wird, aber keinen gültigen Shebang hat. CGI oder suExec können je nach Konfiguration Probleme verursachen. Kurz gesagt, testen Sie unbedingt alles.
quelle
man update-binfmts
.Es sieht aus wie binfmt_misc, und Ihr Hosting-Unternehmen scheint ein bisschen verrückt zu sein :) Aber ich vermute, sie haben dies wahrscheinlich aus Kompatibilitätsgründen getan, damit .php-Dateien php4 und php5-Dateien php5 verwenden. Versuchen Sie es mit einer PHP5-Erweiterung. Dies sollte nicht für alle Dateien auf einer Site erforderlich sein (nur Cronjobs und andere Dinge, die als Serverjobs / -skripte ausgeführt werden), da Ihr Webserver über eine eigene Ausführungslogik / Handler verfügt.
quelle