2010-08-07 2 views
0

Я пытаюсь заставить PHP делать системные вызовы в OS X. Однако он, похоже, не может найти что-либо, что включено в системный путь.

Когда я бегу ...

putenv("PATH={$_SERVER["PATH"]}:/usr/local/bin");

... как раз перед системным вызовом, он работает. Это не практическое решение, так как код, который выполняет системный вызов, является плагином, поэтому я не хочу касаться исходного кода, который сделает его несовместимым, придет обновление.

Apache2 работает как тот же пользователь, что и у меня, поэтому теоретически он имеет доступ к тем же командам, что и я.

Кроме того, тот же код отлично работает на моей машине Ubuntu.

+0

Что говорит 'getenv (« PATH »)' say? Может быть, нет пути для пользователя PHP/Apache на Mac OS? –

+0

Ну, работает , и выходы/usr/bin:/bin:/usr/sbin:/sbin, (мой пользователь) и/usr/bin:/bin:/usr/sbin:/sbin. Запуск «echo $ PATH» с консоли, когда пользователь apache выводит/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/git/bin:/usr/X11/bin – Henrik

ответ

0

Переменные окружения в Mac OS X устанавливаются различными механизмами в зависимости от того, как был запущен ваш код или его родительский процесс. Чтобы гарантировать, что элементы, запущенные из интерактивной оболочки и элементов, запущенных WindowServer, имеют один и тот же путь, вам необходимо синхронизировать ~/.MacOSX/environment.plist с тем, что установлено в .profile (или .cshrc).

Простейшим средством достижения вашей цели без необходимости прибегать к редактированию среды было бы указать временный путь для того, что вы выполняете с помощью вашей системной команды. например .:

char cmdStr[512] = "PATH=$PATH:/usr/local/bin"; 
strncat(cmdStr,"MyCommand", 9); 
system(cmdStr); 

Таким образом, окружающая среда влияет только для контекста МояКоманда и восстановить впоследствии.

+0

Спасибо! Поскольку environment.plist не существует для моего пользователя (возможно, проблема), могу ли я просто соединить его с .profile? Использование PHP-хака на самом деле не является вариантом, так как системный вызов находится в плагине. – Henrik

+0

Нет, это не сработает. Эти файлы находятся в разных форматах и ​​должны иметь различный контент. См. Http://developer.apple.com/library/mac/#qa/qa2001/qa1067.html. – CuriousRabbit

Смежные вопросы