web-dev-qa-db-ja.com

Php-phantomjs with Laravel(ファイルが存在しないか実行可能ではありません:bin / phantomjs)

私はphp-phantomjsをLaravel 5 underCentOS 7およびWindows 8

PHPファントムのインストール(インストールは成功しました)の指示に従いましたが、実行しようとしたときにこのエラーが発生しました基本的な使用法コード:

PhantomJsプロシージャ "default"の実行中にエラーが発生しました-ファイルが存在しないか、実行できません: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で、1つの質問を見つけましたbuntu環境で、誰もがjonnywの「phpphantomjs」をlaravelで正常に使用しましたか?。私は最後のコメントで男が問題を解決したことがわかります:

$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で「phpphantomjs」をうまく使っています。誰が私を助けてくれますか?

注:問題のコードはWindowsバージョンコードですが、両方のOSで同じエラーが発生します。


UPDATE 1

absolute_pathrelative pathに変更した後、phantomjs.exeを認識しているように見えますが、鋼はphantomloaderで同じエラーを発生させます。

ファイルが存在しないか、実行可能ではありません:../ bin/phantomloader(ビュー:PATH_TO_PROJECT\resources\views\welcome.blade.php)

この解決策を試しましたが、同じエラーが発生しました:

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

さて、ここのビデオを見てください: 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());
10
Aditya Giri

多分誰かのために、それは役に立ちます。新しいバージョンのPhp-phantomjs(4。*)にはメソッドがありません。

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

したがって、その代わりに、次のものを使用できます。

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

エラー状態

ファイルが存在しないか、実行可能ではありません:

ファイルが存在することを示しました。今それを実行可能にします

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

もう一度確認してください。それでも機能するはずです。

3
exussum

FWIWこれを非常に迅速なテストプロジェクトにインストールしたところ、1つの小さな調整で問題なく動作しました。

指示に従って、_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を取得したので)応答ステータスを削除することでした。

これはMacでしたが、Centosで違いがあるとは想像できません。

次に、_index.php_ファイルをサブディレクトリpublic内に配置します。これは、Laravel installの場合と同様に、Client::getInstance()の後に次の行を追加するだけです。 :

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

その後、再び機能しました。

明らかにこれは完全なLaravelインストールではありませんが、環境を模倣しています。私が気付いたのは、_bin-dir_の_composer.json_を変更しても必ずしも完全ではないということです。 binに配置されるファイルを更新します。そのため、composer)を新規インストールするために、_rm -rf bin vendor_、次に_composer update_を再度実行する必要がありました。 =とそのパッケージ。

3
alexrussell