Я использую Mac OS X и использую Launchd для автоматического запуска XAMPP. Я установил апачский пользовательский набор для совпадения с моим именем учетной записи в httpd.conf
User cwd Group nogroup
Ну, если я просто позволяю запуску компьютера, и если я выполняю сценарий PHP с этими командами, вот то, что я получаю:
echo exec('whoami'); //cwd exec('echo 1234 | pbcopy'); echo exec('pbpaste'); // (nothing)
Однако, если я останавливаю XAMPP и перезапускаю его (использующий Управление XAMPP), затем он работает как ожидалось, и результатом третьей строки является 1234.
echo exec('pbpaste'); // 1234
У меня также есть подобный опыт с выполнением других системных команд с exec
или shell_exec
как ssh
. Они, кажется, не работают, пока я вручную не перезапускаю апача. У кого-либо есть anythoughts на этом?
Вот мой файл конфигурации запуска:
/Library/LaunchDaemons/xampp.sql.startapache.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>EnableTransactions</key> <true/> <key>Label</key> <string>xampp.startapache.mysql</string> <key>ProgramArguments</key> <array> <string>/Applications/XAMPP/xamppfiles/xampp</string> <string>startmysql</string> </array> <key>RunAtLoad</key> <true/> <key>WorkingDirectory</key> <string>/Applications/XAMPP/xamppfiles</string> <key>KeepAlive</key> <false/> <key>AbandonProcessGroup</key> <true/> </dict> </plist>
Это не вещь полномочия, это - потому что pbcopy и pbpaste нужен сервер области монтажа (по существу, фоновая программа, которая содержит область монтажа), и это выполняется как часть пользовательской сессии входа в систему. launchd выполняет апача в системном контексте, таким образом, нет никакого доступного сервера области монтажа (обратите внимание, что даже при том, что апач переключает пользователей на cwd, это не то же как присоединение к Вашей сессии входа в систему).
Мог бы быть способ присоединиться к конкретной сессии входа в систему (вовлечение launchctl bsexec
), но для веб-сервиса это было бы плохой идеей. Во-первых, потому что это не смогло бы присоединиться, пока Вы не вошли в систему и повредитесь, как только Вы вышли из системы; веб-сервис действительно должен работать независимо от того, кто, оказывается, зарегистрирован в то время. Во-вторых, потому что это означало бы, что Ваши сценарии PHP совместно используют область монтажа с Вашим сеансом пользователя - Вы пошли бы, чтобы скопировать что-то от одной программы до другого и найти, что Вы вставляли в чем-то из веб-сценария, не, что Вы скопировали. И то же самое могло произойти со сценарием - это pbcopies, что-то, затем pbpastes поддерживает что-то совершенно другое, потому что Вы, оказалось, использовали копию с GUI. И если бы несколько копий сценария работали, то они могли бы ступить друг на друга... это была бы полная путаница. Я не уверен, что Вы пытаетесь выполнить с pbcopy и pbpaste, но я вполне уверен, это - неправильный способ сделать это.