Назад | Перейти на главную страницу

Когда расширения файлов переопределяют строки shebang в Linux?

Некоторые задания PHP cron недавно начали давать сбой на общем сервере. Они работали без ошибок и без обновлений почти год, но теперь больше не запускались из-за синтаксических ошибок. Что происходило?

Оказывается, эти сценарии внезапно стали работать под управлением PHP 4, а не PHP 5. Версия PHP 4 установлена ​​в / usr / local / bin / php, но это была строка «shebang» в этих сценариях:

#!/usr/local/php5/bin/php

Провел несколько экспериментов:

% /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

Я не знал, что Linux позволит расширениям файлов переопределять строки shebang, но это то, что я вижу. Служба поддержки в хостинговой компании не знала, почему это происходит (или что изменилось в последнее время, чтобы это произошло), поэтому я пошел с обходным путем: переименовал скрипты, чтобы они больше не оканчивались на «.php».

Задания cron снова выполняются, но я ненавижу ответ «только не делай этого». Мне действительно любопытно узнать, откуда происходит такое поведение, потому что я никогда не видел ничего подобного в * nix на уровне оболочки. Я тестировал как zsh, так и bash, поэтому не думаю, что могу винить конфигурацию оболочки. Я поискал «php» в / etc, чтобы посмотреть, может ли это дать мне какие-нибудь подсказки, но нет. Любые идеи?

Похоже, вы зарегистрировали php в binfmt_misc.

Просмотрите страницу руководства по этой теме: binfmt_misc.txt

Вы захотите отменить регистрацию обработчика php binfmt_misc, указав ему -1 (должен быть root). Он будет указан в / proc / sys / fs / binfmt_misc /, если это ваша проблема.

В качестве предупреждения это может привести к поломке других вещей в системе. Например, если выполняется другой скрипт PHP, но у него нет действительного файла shebang. CGI или suExec могут вызывать проблемы в зависимости от их конфигурации. Короче обязательно все протестируйте.

Это действительно похоже на binfmt_misc, и ваша хостинговая компания кажется немного сумасшедшей :) Но я подозреваю, что они, вероятно, сделали это для совместимости, заставляя файлы .php использовать php4, а файлы php5 использовать php5. Попробуйте расширение php5. Нет необходимости делать это для всех файлов на сайте (только cronjobs и другие вещи выполняются как серверные задания / скрипты), потому что ваш веб-сервер будет иметь свою собственную логику выполнения / обработчики.