Подготовка сервера к переносу сайта, остановилась на одной функции, а именно передача данных из ПХП в ПХП через консоль (командную строку) На рабочей системе (Centos7), уже всё старенькое стало, и развивать без современных инструментов просто бесполезная трата времени. Новый сервер ОС Debian12. Комментарий почившего программиста следующий: Код (Text): #!/usr/bin/env php <?php error_reporting(E_ALL); ini_set('display_errors', 1); //error_reporting(E_ALL); //ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); // Импорт данных в "Личный кабинет". // Пакетный режим. Задание и ход выполнения в таблице calc. // // Каждый импортируемый файл сначала конвертируется к одному или нескольким "стандартным" .csv файлам, // а затем "стандартные" файлы импортируются в ЛК согласно схеме загрузки. // // В командной строке передаётся путь к файлам конфигурации, номер очереди, имя модуля и имена загруженных файлов if ($argc < 5) exit; // upload.php conf job module file1 [file2 ...] // ....... В общем, не подключается похоже в Debian12, Строку #!/usr/bin/env php менял по разному, пытаясь подключить ПХП У нового сервера в этом куча мест с симлинками, которые приводят все к #!/usr/bin/php8.2 Прочитал https://qna.habr.com/q/205194?ysclid=m4yim9osxv2455225 Парни пишут что нужно права давать на файл, который запускает, Но пока не получилось, даже не пробовал права давать... Подключаемые файлы 7 штук, из них 2 имеют разные адреса, Например: #!/usr/bin/env php или #!/usr/local/bin/php Чем эти записи отличаются по функциям? /usr/bin/env php здесь есть файл env, и симлинк на /usr/local/bin/php Что делает env? Просветления пока не случилось,... решил вам написать.
что к чему не подключается? все сумбурно строка 17 PHP: if ($argc < 5) exit; вообще должна ошибку выдать, что $argc не определена ну и похоже у вас php не настроен или настроен но не так как на предыдущем сервере... первую строку поменяйте на !/usr/bin/php8.2 php
$argc не системная, в ПХП выключено расширение сознательно... update-alternatives --config php показал что там: * 0 /usr/bin/php.default 100 auto mode 1 /usr/bin/php.default 100 manual mode 2 /usr/bin/php8.2 82 manual mode по этому пробовал по всякому, .... Стоит панель IspManager, в поддержке хостинга сказали что не поддерживается установка для альтернативных пакетов ПХП. А проект сначала на ПХП 7.0 нужно перевезти на новый сервер.
Сейчас начитал, чтобы найти вызываемый шебанг для PHP в Linux, команда в консоли Код (Text): which php Накопал тут: https://stackoverflow.com/questions/21731745/how-to-add-shebang-with-php-script-on-linux Что нужно не запоминать его, научиться его использовать Мне показал в на одном сервере /usr/local/bin/php На другом /usr/bin/php Хз, что так... вроде серверы одинаковые... И поменяв в файлах, результата не получил... Единственное что, в логах ошибок ПХП , ошибки перестали появляться...
Правильно заданный вопрос - 50% ответа (с) Попробуйте описать вопрос более просто, без примеров своего кода... например... - хочу запускать php код из командной строки с передачей N аргументов, как это сделать ... разобрались - дальше задаете вопросы или - как запустить php скрипт из командной строки - ответ php script.php ну конечно при условии что в системе прописан php и все настроено шебанг - чтоб запускать без указания в командной строке php, но там надо права еще файлу выставить что исполняемый
Наверно нужно тему сменить, с вами согласен. Выяснил сейчас что вообще не работает shebang Окно терминала повисает если попробовать запустить файл через терминал. Права первым делом все проверил.
Сам шебанг не может не работать! Ты в любом случае это делаешь в терминале, хоть с явным указанием php, хоть доверившись shebang. Вначале пробовать это надо с таким скриптом, который на 103% является рабочим, иначе будет миллион догадок почему зависло. Сделай такой скрипт буквально test.php PHP: <?php echo 'PHP version: ' . phpversion() . "\n"; echo 'Path to script: ' . __FILE__ ."\n"; Запусти его как `php ./test.php`, без шебангов!!! Если он не сработает, значит тупо php не установлен нормально. А если сработает, то test.php version 2: PHP: #!/usr/bin/env php <?php echo 'PHP version: ' . phpversion() . "\n"; echo 'Path to script: ' . __FILE__ ."\n"; Не забудь сделать `chmod +x ./test.php` ! И запусти его уже как `./test.php` Если сработает, то значит проблема в коде твоего большого скрипта. Отлаживать его надо. Короче, двигайся маленькими подконтрольными тебе шагами. Не должно быть "не работает!". Может быть только "не работает потому что..." )))
Насчет рабочести $argc можно добавить в test.php строку: PHP: echo '$argc is ' . (!isset($argc) ? 'not set' : 'equal to ' . $argc) . "\n"; в норме при вызове из консоли $argc есть и как минимум равен 1
Спасибо за подсказку! Второй день думаю как в логи передать все переменные, которые приходят в это место. Результат в консоли браузера можно увидеть? Собрал вчера новый тестовый сервер, специально ни чего лишнего не пробовал ставить, чтоб сначала разобраться с $PATH , и работой этой подсистемы. Так оно рабочее всё, с рабочего сервера переставлено, вопрос настроить правильно. Если нативная версия ПХП сервера будет отличаться от ПХП сайта, мешать работе не будет? Мне кажется не должно, так как код совместим с php 8.2 --- Добавлено --- Тут вопрос меня ещё мучает, хоть читал много текста про права! Если это делать файловым менеджером, например FileZilla, или через Файловый менеджер IspManager Разница будет с `chmod +x ./test.php` ? Я даже пробовал окончания строк править утилитой Dos2Unix, без результата.
Положил 2 тестовых файла 1. test.php Код (Text): <?php echo 'PHP version: ' . phpversion() . "\n"; echo 'Path to script: ' . __FILE__ ."\n"; 2. test2.php Код (Text): #!/usr/bin/env php <?php echo 'PHP version: ' . phpversion() . "\n"; echo 'Path to script: ' . __FILE__ ."\n"; из домашней директории root запускаем: Код (Text): php /var/www/test/data/www/pafes.org/sites/all/modules/vircadm/test.php не работает Код (Text): php /var/www/test/data/www/pafes.org/sites/all/modules/vircadm/test2.php работает: PHP version: 8.2.26 Path to script: /var/www/test/data/www/pafes.org/sites/all/modules/vircadm/test2
А что пишет? Теоретически работать должно, пыхе этот первый комментарий до лампочки. Этот коммент для линуха, чтоб линух знал, что если этот текстовый файл сделали исполняемым и пытаются выполнить, его надо выполнять через пыху. А для самой пыхи всё, что вне <?php ?> вообще до лампочки, она просто выдаёт это в стандартный вывод, не интерпретируя
Плохой мальчик! ))) Ты в этот момент root? В данном случае на тест вроде не влияет, но привычка делать всё из-под рута потенциально приводит к проблемам. Не надо решать одну проблему и создавать другую. Делай всё что возможно из-под аккаунта которым nginx и php-fpm пользуются — www-data видимо. И только установку ПО делай рутом (например через sudo). Конкретнее, что происходит, какой текст в консоли? Там скорее всего написано в чём проблема.
в общем, не туда посмотрел, всё в первом скрипте выводит Дальше идем, Указал на файл версии ПХП который установлен на сайте: #!/opt/php70/bin/php Результат: php: cannot execute: required file not found Буду тестировать дальше
Разобрался! Как всегда все оказалось проще. Причина в символе BOM в конце shebang. После того как его убрали, ошибка пропала. Я пробовал изменить окончание строк на unix, утилитой unix2dos, а оказалось что нужно просто символы убрать. Дебиан 12 похоже, критично к этому относится! Нашли это, сисадмины службы поддержки FirstVDS/FirstDEDIC. Всем огромное ... кто подключился к этому вопросу! С Наступающим, Новым Годом!
Отписались в поддержку IspManager, следующим текстом, посмотрим что будет: Редактирование файлов после переноса пользователя, выполнялось редактором IspManager. Получается что знак BOM добавил именно встроенный редактор. В редакторе есть выбор кодировок, есть UTF-8 всё вроде правильно! Но должны быть и варианты UTF-8 без BOM, как например в Notepad++ Редактирование через встроенный редактор, делали для экономии времени, так как после переноса, нужно как можно быстрее сделать исправление окружения. Ни кто не мог даже подумать, что ваш редактор добавит знак. Редактировали строку shebang, и права доступа к этим файлам, так как можно быстро назначить права выбранным файлам.