Php-phantomjs с Laravel (Файл не существует или не является исполняемым: bin/phantomjs)
Я пытаюсь использовать php-phantomjs с Laravel 5 под CentOS 7 и Windows 8.
Я выполнил инструкции в PHP Phantom установка (установка выполнена с успехом), после чего я получил эту ошибку при попытке выполнить код Basic Usage:
Ошибка при выполнении процедуры PhantomJs "по умолчанию" - файл не существует или не является исполняемым: bin/phantomjs (View: PATH_TO_PROJECT\resources\views\welcome.blade.php)
Основной код использования
use JonnyW\PhantomJs\Client;
$client = Client::getInstance();
/**
* @see JonnyW\PhantomJs\Message\Request
**/
$request = $client->getMessageFactory()->createRequest('http://google.com', 'GET');
/**
* @see JonnyW\PhantomJs\Message\Response
**/
$response = $client->getMessageFactory()->createResponse();
// Send the request
$client->send($request, $response);
if($response->getStatus() === 200) {
// Dump the requested page content
echo $response->getContent();
}
Я много искал, находил и пытался несколько решений, но безуспешно. Здесь, в Stackoverflow, я нашел один вопрос Любой, кто успешно использовал jonnyw php phantomjs с laravel, в ubuntu envirement?. Я могу видеть в последнем комментарии, что парень решил проблему с помощью:
$client->setBinDir('absolute_path/bin');
$client->setPhantomJs('phantomjs.exe');
Я тоже triyed, и он возвращает другую ошибку:
Файл не существует или не является исполняемым: phantomjs.exe(View: PATH_TO_PROJECT\resources\views\welcome.blade.php)
Но когда я пытаюсь:
echo file_exists('absolute_path/bin/phantomjs.exe');
Он возвращает 1, что означает, что PHP может найти файл с absolute_path
.
Я не знаю, что я делаю неправильно. Кто-нибудь уже успешно использовал "php phantomjs" с laravel, который может мне помочь?
ПРИМЕЧАНИЕ. Код, содержащийся в вопросе, - это код версии Windows, но я получаю ту же ошибку в обеих ОС.
ОБНОВЛЕНИЕ 1
После изменения absolute_path
на relative path
теперь кажется, что он знает phantomjs.exe
, но сталь поднимает ту же ошибку с помощью phantomloader
:
Файл не существует или не является исполняемым:../bin/phantomloader (View: PATH_TO_PROJECT\resources\views\welcome.blade.php)
Пробовал это решение, но ту же ошибку:
$client->setPhantomLoader('../bin/phantomloader');
Ответы
Ответ 1
Хорошо, посмотрите здесь видео:
https://www.youtube.com/watch?v=unLTKz9Jqyw
Этот парень объясняет все, что вам может понадобиться. Надеюсь, что это поможет.
ИЗМЕНИТЬ
Попробуйте поместить этот код...
<?php
//test.php
$phantom_loc = "C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\web-optimization\phantomjs4\src\bin\phantomjs.exe";
$dir = "C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\web-optimization\phantomjs4\src\bin\\";
//Is dir executable
$dir_is_Writeable = @file_exists($dir . ".");
if ($dir_is_Writeable === true) {
echo "$dir is writable";
} else {
echo "$dir is not writable";
}
echo "<br><br>";
//is executable
if(is_executable($phantom_loc)) {
echo ("$phantom_loc is executable");
} else {
echo ("$phantom_loc is not executable");
}
echo "<br><br>";
//Jonnyw
require 'vendor/autoload.php';
use JonnyW\PhantomJs\Client;
$client = Client::getInstance();
$client->setBinDir('C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\web-optimization\phantomjs4\src\bin\\');
$client->setPhantomJs('phantomjs.exe');
var_dump($client->getCommand());
Ответ 2
Возможно, для кого-то это будет полезно. Новая версия Php-phantomjs (4. *) не имеет методов:
$client->setBinDir('absolute_path/bin');
$client->setPhantomJs('phantomjs.exe');
Итак, вместо этого вы можете использовать это:
$client->getEngine()->setPath('absolute_path/bin/phantomjs.exe');
Ответ 3
FWIW Я только что установил это в очень быстром тестовом проекте, и он отлично работал с одной небольшой настройкой.
Я добавил следующее в мой файл composer.json
в соответствии с инструкциями:
"require": {
"jonnyw/php-phantomjs": "~3.0"
},
"config": {
"bin-dir": "bin"
},
"scripts": {
"post-install-cmd": [
"PhantomInstaller\\Installer::installPhantomJS"
],
"post-update-cmd": [
"PhantomInstaller\\Installer::installPhantomJS"
]
}
Затем composer install
установит библиотеку и затем установит phantomjs впоследствии.
Затем я скопировал и вставил верхний пример из http://jonnnnyw.github.io/php-phantomjs/usage.html#basic-request в index.php
(после того, как потребовался автозагрузчик Composer).
Все, что я тогда должен был сделать (потому что я в Великобритании), удалил статус ответа, если (как я получаю 301), чтобы показать главную страницу Google.
Теперь это было на Mac, но я не могу себе представить, чтобы это отличалось от Centos.
Затем, поместив мой файл index.php
в подкаталог public
, как и в установке Laravel, все, что мне нужно было сделать, это добавить следующую строку после Client::getInstance()
:
$client->setBinDir('../bin');
Затем он снова работал.
Очевидно, что это не полная установка Laravel, но она похожа на окружающую среду. Я заметил, что изменение bin-dir
в composer.json
не всегда полностью обновляет файлы, которые помещаются в bin
. Таким образом, мне пришлось rm -rf bin vendor
, а затем composer update
снова убедиться, что у меня была новая установка композитора и его пакетов.
Ответ 4
Состояние ошибки
Файл не существует или не является исполняемым:
Вы показали, что файл существует. Теперь сделайте его выполнимым
chmod +x /path/to/bin/phantomloader
И попробуйте еще раз
Если это работает, вам необходимо заблокировать некоторые разрешения
Какой пользователь работает php? Когда вы узнаете об использовании
chmod -x /path/to/bin/phantomloader
chown phpuser /path/to/bin/phantomloader
chmod u+x /path/to/bin/phantomloader
Проверьте еще раз, и он все равно должен работать