Я столкнулся с действительно странной проблемой, для которой у меня нет никаких объяснений.
После настройки OS X Yosemite и моей локальной среды разработки с использованием XAMPP я установил ImageMagick через MacPorts. Все хорошо, все отлично работает в командной строке.
Тем не менее, когда выполняется через Apache и вызывается через PHP, я не получаю никакого вывода от него вообще.
Я провел обширные исследования и нашел множество подходов:
exec()
указан как отключенная функция (которой нет)convert
даже вызывается, как в исполняемом файле (который это)Я даже дошел до копирования convert
исполняемый файл в корневой каталог локального проекта и пытается exec('./convert');
но безрезультатно. Я всегда не получаю абсолютно никакой информации от этого звонка. Даже не сообщение об ошибке. Само собой разумеется, когда я запускаю ту же самую вещь через Терминал, это работает отлично.
Я также попробовал:
exec('ls');
чтобы увидеть, если что-нибудь подходит (да, это работает, это нормально)exec('which convert');
где я ничего не получаю — звонок ничего не возвращаетexec('which ls');
перепроверить, была ли проблема с which
— но который работает нормально и дает мне /bin/ls
в ответ.chmod 0777
в исполняемый файл — безрезультатноНезависимо от того, что я пытаюсь или делаю, convert
остается полностью неприкосновенным к PHP / Apache.
Может кто-нибудь сказать мне, почему это и как это исправить?
Проверяя журналы ошибок Apache, я обнаружил следующее сообщение:
dyld: Library not loaded: /opt/local/lib/libfreetype.6.dylib
Referenced from: /opt/local/bin/convert
Reason: Incompatible library version: convert requires version 18.0.0 or later, but libfreetype.6.dylib provides version 15.0.0
Исследования показали, что существует общий подход, изменяющий некоторую переменную пути среды, которая применяется к Apache и его вспомогательным процессам во время работы. Однако, так как я не хотел возиться так, я пошел на несколько более грубый подход:
Я открыл терминал и пошел в самый корневой каталог моей системы. Там я побежал:
find . -name "libfreetype.6.dylib"
Это дало мне все libfreetype.6.dylib
файлы, которые были доступны в моей системе. Один из них был в XAMPP lib
каталог, другой был в /usr/local/lib
,
Я делаю резервную копию файла в XAMPP каталог, а затем скопировал один из /usr/local/lib
там.
Я тогда проверил convert
снова через Apache и получил другое, очень похожее сообщение об ошибке, касающееся libexpat.1.dylib
, Для этого я повторил процесс копирования, как указано выше. После этого, convert
был выполнен через Apache, и проблема была решена.
Когда вы запускаете скрипты и программы через ваш веб-сервер, они запускаются другим пользователем. В Маках это обычно _www
, convert
приложение не может быть найдено, потому что путь к его исполняемому файлу (вероятно, /usr/local/bin
) не входит в $PATH
настройка среды для этого пользователя.
Самое простое решение — просто добавить в команду префикс с путем к convert
то есть exec('/usr/local/bin/convert ... ');