Интеллектуальная идея отображает математический метод как символы, как отключить эту функцию [duplicate]

Еще несколько заметок.

  • Для отладки всегда завершайте функцию exec / shell_exec в var_dump() .
  • error_reporting(-1); следует как и display_errors, в качестве последнего средства даже set_error_handler("var_dump"); - если только посмотреть, не вызывает ли PHP сам execvp или еще.
  • Используйте 2>&1 (объединить оболочки STDERR в поток STDOUT), чтобы понять, почему вызов не выполняется. В некоторых случаях вам может потребоваться обернуть вашу команду в вызове дополнительной оболочки:
    // capture STDERR stream via standard shell
    shell_exec("/bin/sh -c 'ffmpeg -opts 2>&1' ");
    
    Повторно перенаправить файл журнала, как рекомендовано @Mike, является наиболее рекомендуемым подходом.
  • Альтернативный вариант между различными функциями exec для обнаружения сообщения об ошибках. Хотя они в основном делают то же самое, выходные пути возврата меняются: exec() → либо возвращает результат как результат функции, либо через необязательный параметр $output. Также предоставляет параметр $return_var, который содержит код errno / exit приложения запуска или оболочки. Вы можете получить: ENOENT (2) - Нет такого файла EIO (127) - Ошибка ввода-вывода: файл не найден shell_exec() → то, что вы хотите запускать в основном для выражений в стиле оболочки , Обязательно назначьте / напечатайте возвращаемое значение, например. var_dump(shell_exec("...")); `` встроенные backticks → идентичны shell_exec. system() → аналогичен exec, но всегда возвращает результат как результат функции (распечатайте!). Дополнительно позволяет фиксировать код результата. passthru() → еще одна альтернатива exec, но всегда отправляет любые результаты STDOUT в выходной буфер PHP. Какой из них делает его наиболее подходящей оболочкой exec. popen() или лучше proc_open() → позволяют индивидуально фиксировать STDOUT и STDERR.
  • Большинство ошибок оболочки заканчиваются на PHP или Apache error.log, когда они не перенаправлены. Проверьте свой журнал syslog или Apache, если ничего не дает полезных сообщений об ошибках.

Наиболее распространенными проблемами, возникающими у новичков PHP / LAMP, являются:

  • Как уже упоминалось @Kuf : для устаревших планов веб-хостинга вы все равно можете найти safe_mode или disable_functions. Ни одна из функций exec PHP не будет работать. (Лучше всего найти лучшего поставщика, иначе расследуйте «CGI», но не устанавливайте собственный интерпретатор PHP, пока не развернуты.)
  • Аналогично может быть AppArmor / SELinux / Firejail. Они ограничивают способность каждого приложения создавать новые процессы.
  • Предназначенный двоичный файл не существует. Практически не существует никаких веб-хостов, таких как ffmpeg. Вы не можете просто запускать произвольные команды оболочки без подготовки. Некоторые вещи необходимо установить!
    // Check if `ffmpeg` is actually there:
    var_dump(shell_exec("which ffmpeg"));
    
  • PATH выключен. Если вы установили специальные инструменты, вам необходимо убедиться, что они доступны. Использование var_dump(shell_exec("ffmpeg -opts")) будет искать все распространенные пути - или как было сказано / ограничено Apache (часто просто /bin:/usr/bin). Проверьте с помощью print_r($_SERVER);, что содержит ваш PATH, и если это покрывает инструмент, который вы хотите запустить. Кроме того, вам может потребоваться адаптировать настройки сервера (/ etc / apache2 / envvars) или использовать полные пути:
    // run with absolute paths to binary
    var_dump(shell_exec("/bin/sh -c '/usr/local/bin/ffmpeg -opts 2>&1'"));
    
    Это несколько подрывает концепцию оболочки. Лично я не считаю это предпочтительным. Однако это имеет смысл для целей безопасности; кроме того, для использования пользовательской установки, конечно.
  • Разрешения Для запуска двоичного кода в системе BSD / Linux его нужно сделать «исполняемым». Это то, что делает chmod a+x ffmpeg. Дальнейшее изменение пути к таким пользовательским двоичным файлам должно быть доступно для чтения пользователю Apache, с которым работают ваши скрипты PHP. Более современные настройки используют PHP, встроенные в режим FPM (suexec + FastCGI), где ваша учетная запись веб-хостинга равна тому, с чего работает PHP.
  • Тест с SSH. Это должно быть само собой разумеющимся, но перед запуском команд через PHP тестирование его в реальной оболочке было бы очень разумным. Зонд, например. ldd ffmpeg, если существуют все зависимости lib, и если он работает иначе.
  • Входные значения (GET, POST, имена FILE, пользовательские данные), которые передаются как аргументы команды в строках exec, должны быть экранированы с помощью escapeshellarg() .
    $q = "escapeshellarg";
    var_dump(shell_exec("echo {$q($_GET['text'])} | wc"));
    
    В противном случае вы легко получите синтаксические ошибки оболочки; и, вероятно, использовать код, установленный позже ...
  • Будьте внимательны, чтобы не комбинировать обратные ссылки с любой из функций *exec():
    $null = shell_exec(`wc file.txt`);
                       ↑           ↑
    
    Backticks запускает команду и оставляет shell_exec с выходом уже выполнил команду. Используйте обычные кавычки для обертывания параметра команды.

В Windows:

  • Вызовы CMD не будут хорошо воспроизводиться с потоками STDERR.
  • Определенно попробуйте сценарий Powershell для запуска любых приложений CLI или используйте командную строку, такую ​​как: system ("powershell -Command 'pandoc 2> & amp; 1'");
  • Используйте полные пути и предпочитайте передние косые черты всегда ("C:\Program Files\Whatevs\run.exe" с дополнительными кавычками, если пути содержат пробелы). Слишком быстро работающие чернила также работают в Windows с тех пор, как они были введены в MS-DOS 2.0
  • . Выясните , какая служба и учетная запись SAM выполняются как IIS / Apache, так и PHP. Убедитесь, что у него есть разрешения на выполнение.
  • Обычно вы не можете запускать приложения с графическим интерфейсом. (Типичное обходное решение - вызовы taskcheduler или WMI.)

3
задан CrazyCoder 28 April 2017 в 12:41
поделиться

1 ответ

Вы установили плагин Advanced Java Folding , который делает именно то, что вы видите, сбрасывает и аббревиатура некоторых языковых конструкций.

Либо удалить / отключить подключаемый модуль или настроить его варианты в соответствии с вашими личными предпочтениями:

4
ответ дан CrazyCoder 15 August 2018 в 19:18
поделиться
  • 1
    Я удалил его, но аббревиатуры все еще находятся в моем коде. – Eirik 28 April 2017 в 13:26
  • 2
    Может быть, я должен переустановить IntelliJ .. :) – Eirik 28 April 2017 в 13:27
  • 3
    Проверьте другие параметры Folding, например, сбросить однострочные методы и т. Д. Отключите их все , если вам не нужно сгибать. – CrazyCoder 28 April 2017 в 13:28
  • 4
    Немного поздно ответил, но я это проработал. Спасибо за помощь :) – Eirik 7 May 2017 в 18:44
Другие вопросы по тегам:

Похожие вопросы: