【问题标题】:Php-phantomjs with Laravel (File does not exist or is not executable: bin/phantomjs)带有 Laravel 的 Php-phantomjs(文件不存在或不可执行:bin/phantomjs)
【发布时间】:2015-11-08 00:52:43
【问题描述】:

我正在尝试在 CentOS 7Windows 8 下将 php-phantomjs 与 Laravel 5 一起使用。

我按照 PHP Phantom installation 的说明进行操作(安装成功),然后在尝试执行 基本用法 代码时收到此错误:

执行 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();
}

我在 Google 上搜索了很多,找到并尝试了几种解决方案,但都没有成功。在 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 的文件。


我不知道我做错了什么。任何已经成功使用 laravel 的“php phantomjs”的人可以帮助我吗?

注意:包含的代码是 Windows 版本代码,但我在两个操作系统中都收到相同的错误。


更新 1

在将absolute_path 更改为relative path 之后,它现在似乎知道phantomjs.exe,但是steel 与phantomloader 引发了同样的错误:

文件不存在或不可执行:../bin/phantomloader(查看:PATH_TO_PROJECT\resources\views\welcome.blade.php)

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

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

【问题讨论】:

  • 你已经放弃了自动加载composer dump-autoload 吗?
  • 只是现在,不幸的是没有变化,同样的问题:(
  • 你使用的是什么操作系统?
  • 您确定您使用的是 Linux 二进制文件吗?因为phantomjs.exe(很可能)是 Windows 可执行文件。
  • 感谢您抽出宝贵时间@user3584460,是的,我确定。我使用 CentOS 7 和 Windows 8,并且在更新我的答案的两个操作系统中都收到相同的错误(有问题的代码是 windows 版本)。

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


【解决方案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());

【讨论】:

  • 你那里有phantomjs.exe吗?或者你甚至安装了 phnatomjs,因为我在你安装 PhantomJS 的页面上的任何地方都找不到它。如果没有,请转到 phantomjs.org/download.html 并立即安装。
  • 是的,已经在问题中提到“我按照 PHP Phantom 安装中的说明进行操作(安装成功)”。
  • 你有phantomJS.exe在同一个目录吗?如果没有尝试把它。因为代码对我来说工作正常。
  • 我在 /bin 目录中有 phantomJS.exe。
  • 是同一目录下的phantomloader
【解决方案2】:

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

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

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

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

【讨论】:

  • 为了让它与 Symfony 一起工作,我使用了相对路径 $phantom->getEngine()->setPath('../bin/phantomjs');
【解决方案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 的自动加载器之后)。

然后我所要做的(因为我在英国)就是删除响应状态 if(因为我收到 301)以显示 Google 主页。

现在这是在 Mac 上,但我无法想象在 Centos 上会有什么不同。

然后,将我的 index.php 文件放在子目录 public 中,就像在 Laravel 安装中一样,我所要做的就是在 Client::getInstance() 之后添加以下行:

$client->setBinDir('../bin');

然后它又工作了。

显然这不是完整的 Laravel 安装,但它确实模仿了环境。我确实注意到的一件事是更改composer.json 中的bin-dir 并不总是完全更新放入bin 中的文件。因此,我不得不rm -rf bin vendor,然后再次composer update,以确保我重新安装了composer及其软件包。

【讨论】:

  • 好的,我会尝试做同样的事情并从头开始重新安装。
  • 可能首先是rm -rf bin vendor,然后是composer update。这应该会给你一个全新的 Composer 安装。但是请确保您在composer.json 中有bin-dir 的东西,并将$client 的bin 目录设置为../bin
【解决方案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

再次检查,它应该仍然有效

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 2019-06-05
    • 2016-10-20
    • 1970-01-01
    • 2017-01-03
    • 2019-02-17
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多