Еще несколько заметок.
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()
→ либо возвращает результат как результат функции, либо через необязательный параметр $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. error.log
, когда они не перенаправлены. Проверьте свой журнал syslog или Apache, если ничего не дает полезных сообщений об ошибках. Наиболее распространенными проблемами, возникающими у новичков PHP / LAMP, являются:
safe_mode
или disable_functions
. Ни одна из функций exec PHP не будет работать. (Лучше всего найти лучшего поставщика, иначе расследуйте «CGI», но не устанавливайте собственный интерпретатор PHP, пока не развернуты.) 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'"));
Это несколько подрывает концепцию оболочки. Лично я не считаю это предпочтительным. Однако это имеет смысл для целей безопасности; кроме того, для использования пользовательской установки, конечно. chmod a+x ffmpeg
. Дальнейшее изменение пути к таким пользовательским двоичным файлам должно быть доступно для чтения пользователю Apache, с которым работают ваши скрипты PHP. Более современные настройки используют PHP, встроенные в режим FPM (suexec + FastCGI), где ваша учетная запись веб-хостинга равна тому, с чего работает PHP. ldd ffmpeg
, если существуют все зависимости lib, и если он работает иначе. escapeshellarg()
. $q = "escapeshellarg";
var_dump(shell_exec("echo {$q($_GET['text'])} | wc"));
В противном случае вы легко получите синтаксические ошибки оболочки; и, вероятно, использовать код, установленный позже ... *exec()
: $null = shell_exec(`wc file.txt`);
↑ ↑
Backticks запускает команду и оставляет shell_exec с выходом уже выполнил команду. Используйте обычные кавычки для обертывания параметра команды. В Windows:
"C:\Program Files\Whatevs\run.exe"
с дополнительными кавычками, если пути содержат пробелы). Слишком быстро работающие чернила также работают в Windows с тех пор, как они были введены в MS-DOS 2.0 Я уверен, что путь к классам и путь поиска разделяемой библиотеки имеют мало общего с друг другом. Согласно JNI Book (который, по общему признанию, старый), в Windows, если вы не используете системное свойство java.library.path
, DLL должна находиться в текущем рабочем каталоге или в каталоге, указанном в Windows PATH
.
Обновление:
Похоже, что Oracle удалил PDF со своего веб-сайта. Я обновил ссылку выше, чтобы указать на экземпляр PDF, который живет в Техасском университете в Арлингтоне.
Кроме того, вы также можете прочитать HTML-версию Oracle спецификации JNI , Это живет в разделе Java 8 веб-сайта Java и, надеюсь, будет некоторое время.
Обновление 2:
По крайней мере, в Java 8 (я не знаю, t проверены более ранние версии), вы можете сделать:
java -XshowSettings:properties -version
, чтобы найти путь поиска совместно используемой библиотеки. Посмотрите на значение свойства java.library.path
в этом выходе.
В моей ситуации я пытался запустить веб-сервис java в Tomcat 7 через разъем в Eclipse. Приложение работает хорошо, когда я развернул файл войны на экземпляр Tomcat 7 на моем ноутбуке. Для приложения требуется драйвер jdbc типа 2 для «IBM DB2 9.5». По какой-то нечетной причине соединитель в Eclispe не мог видеть или использовать пути в переменных среды IBM DB2, чтобы добраться до DLL-файлов, установленных на моем ноутбуке, как клиент jcc. В сообщении об ошибке либо указано, что ему не удалось найти файл db2jcct2 dll, либо ему не удалось найти зависимые библиотеки для этого DLL-файла. В конечном итоге я удалил соединитель и перестроил его. Затем он работал правильно. Я добавляю это решение здесь как документацию, потому что мне не удалось найти это конкретное решение в другом месте.
Имели идентичную проблему с машиной XP при установке javacv
и opencv
в сочетании с Eclipse. Оказалось, что мне не хватало следующих файлов:
Как только они были установлены, проект скомпилирован и работает нормально.
Если вы загружаете 32-разрядную версию вашей DLL с 64-разрядной JRE, у вас может возникнуть проблема. Это был мой случай.
chromedriver.exe
- драйвером Selenium для Chrome, который, насколько я могу судить, представлен только в 32-разрядной версии.
– SantiBailors
16 December 2016 в 11:31
У меня была такая же проблема, и я пробовал все, что было опубликовано здесь, чтобы исправить это, но никто не работал для меня. В моем случае я использую Cygwin для компиляции dll. Кажется, что JVM пытается найти JRE DLL на виртуальном пути Cygwin. Я добавил путь виртуального каталога Cygwin к DLL JRE, и теперь он работает. Я сделал что-то вроде:
SET PATH = "/ cygdrive / c / Program Files / Java / jdk1.8.0_45";% PATH%
blockquote>
Проверьте правильность пути к вашей библиотеке или нет. Конечно, вы можете использовать следующий код для проверки пути к пути к вашей библиотеке: System.out.println(System.getProperty("java.library.path"));
Вы можете назначить java.library.path при запуске приложения Java:
java -Djava.library.path=path ...
Я нашел отличную статью некоторых друзей в сейфе, которые прошли через то же самое, что и я. Это сработало для меня, поэтому, надеюсь, это поможет вам! Прочитайте, если вам интересно ( Опасности загрузки собственных библиотек на Android ) или просто используйте
compile 'com.getkeepsafe.relinker:relinker:1.2.3'
и замените
System.loadLibrary("myLibrary");
с
ReLinker.loadLibrary(context, "mylibrary");
Я хочу сообщить об этом интересном случае, попробовав весь вышеперечисленный метод, ошибка все еще существует. Странно, что это работает на компьютере под управлением Windows 7, но в Windows XP это не так. Затем я использую хост зависимостей и обнаружил, что в Windows XP нет VC ++ Runtime в качестве требования к моей DLL. После установки VC ++ Runtime package здесь он работает как шарм. Меня беспокоило то, что он продолжает говорить. Невозможно найти зависимые библиотеки, в то время как интуитивно зависит от JNI-зависимой dll, однако, наконец, получается, что зависимая от JNI dll требует другого зависимого dl. Надеюсь, это поможет.
Visual C++ Redistributable for VS2012
VSU_4\vcredist_x64.exe
или VSU_4\vcredist_x84.exe
в зависимости от конфигурации вашей системы dll
в папку lib
вместе с вашими другими библиотеками (например, \lib\win32-x86\your dll files
). У меня была точно такая же проблема, и, наконец, она была решена.
Я поместил все зависимые DLL в ту же папку, где был сохранен mylib.dll, и убедитесь, что JAVA Compiler смог его найти (если в пути компиляции нет mylib.dll, будет ошибка сообщая об этом во время компиляции). Важно отметить, что вы должны убедиться, что все зависимые библиотеки имеют одну и ту же версию с mylib.dll, например, если ваша версия mylib.dll является версией, тогда вы также должны поместить в нее версию всех зависимых библиотек ,
Надеюсь, это поможет другим, кто столкнулся с одной и той же проблемой.
CLASSPATH
вообще не используется. Я не уверен, чтоcwd
используется вообще.java.library.path
или простоPATH
. @dB ', то место, где у вас есть, теперь wrong i>. – Ernest Friedman-Hill 23 May 2011 в 04:41