与Laravel的Php-phantomjs(文件不存在或不可执行:bin / phantomjs)

时间:2015-08-14 17:25:34

标签: php laravel centos laravel-5.1 php-phantomjs

我正尝试在 CentOS 7 Windows 8 下使用 php-phantomjs 和Laravel 5。

我按照 PHP Phantom installation 上的说明(安装成功完成),之后我在尝试执行基本用法代码时收到此错误:< / p>

执行PhantomJs过程时出错“默认” - 文件不存在或不可执行:bin / phantomjs(查看: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上,我发现了一个问题 Anyone successfully used jonnyw's “php phantomjs” with laravel, in a ubuntu envirement? 。我可以在最后一条评论中看到这个家伙解决了这个问题:

$client->setBinDir('absolute_path/bin');
$client->setPhantomJs('phantomjs.exe');

我也试着去了,这又回来了另一个错误:

文件不存在或不可执行:phantomjs.exe(查看: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(查看:PATH_TO_PROJECT \ resources \ views \ welcome.blade.php)

试过这个解决方案,但同样的错误:

$client->setPhantomLoader('../bin/phantomloader');

4 个答案:

答案 0 :(得分:10)

好了,看看这里的视频: 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());

答案 1 :(得分:9)

也许对某人来说,这会有所帮助。新版本的Php-phantomjs(4. *)没有方法:

$client->setBinDir('absolute_path/bin');
$client->setPhantomJs('phantomjs.exe');

因此,您可以使用它来代替它:

$client->getEngine()->setPath('absolute_path/bin/phantomjs.exe');

答案 2 :(得分: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以确保我有一个全新的作曲家及其包装。

答案 3 :(得分:3)

错误状态

文件不存在或不可执行:

您已显示该文件存在。现在让它成为可执行文件

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

再次检查,它仍然可以正常工作