3

あるサイトを別の Web ホスティングに移動しました。ローカルホストでテストするとすべて正常に動作しますが、オンラインで試すと次のように表示されます。

curl_setopt() [<a href='function.curl-setopt'>function.curl-setopt</a>]: 
    CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or 
    an open_basedir is set

TCPDF で PDF ファイルを生成しようとすると (7542 行でエラーが発生します)

7534             if ($imsize === FALSE) {
7535                 if (function_exists('curl_init')) {
7536                     // try to get remote file data using cURL
7537                     $cs = curl_init(); // curl session
7538                     curl_setopt($cs, CURLOPT_URL, $file);
7539                     curl_setopt($cs, CURLOPT_BINARYTRANSFER, true);
7540                     curl_setopt($cs, CURLOPT_FAILONERROR, true);
7541                     curl_setopt($cs, CURLOPT_RETURNTRANSFER, true);
7542                     curl_setopt($cs, CURLOPT_FOLLOWLOCATION, true);

これを回避するにはどうすればよいですか?

4

3 に答える 3

1

ホスティング会社/部門が safe_mode をオフにすることを望まない場合、回避策として、php.net http://php.net/manual/ro/function.curl-setopt.php#71313にあるこの便利なスニペットを使用できます。

function curl_redir_exec($ch)
{
    static $curl_loops = 0;
    static $curl_max_loops = 20;
    if ($curl_loops++ >= $curl_max_loops) {
        $curl_loops = 0;
        return FALSE;
    }
    curl_setopt_array($ch, array(CURLOPT_HEADER => true, CURLOPT_RETURNTRANSFER => true));
    $data = curl_exec($ch);
    list($header, $data) = explode("\n\n", $data, 2);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($http_code == 301 || $http_code == 302) {
        $matches = array();
        preg_match('/Location:(.*?)\n/', $header, $matches);
        $url = @parse_url(trim(array_pop($matches)));
        if (!$url) {  //couldn't process the url to redirect to
            $curl_loops = 0;
            return $data;
        }
        $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
        foreach(array('scheme', 'host', 'path') as $component) {
            if (!$url[$component]) {
                $url[$component] = $last_url[$component];
            }
        }
        $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] 
                 . ($url['query'] ? '?' . $url['query'] : '');
        curl_setopt($ch, CURLOPT_URL, $new_url);
        return curl_redir_exec($ch);
    } else {
        $curl_loops = 0;
        return $data;
    }
}
于 2012-04-13T10:01:35.743 に答える
0

オフsafe_modeopen_basedirして、ホストに入れる必要があります。ホスティングサポートからお問い合わせいただけます。利用できない場合は、の値open_basedirを (0) に変更できます。

例:

    curl_setopt($rConnect, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($rConnect, CURLOPT_FOLLOWLOCATION, 1);

に変更する必要があります

    curl_setopt($rConnect, CURLOPT_RETURNTRANSFER, 0);
    curl_setopt($rConnect, CURLOPT_FOLLOWLOCATION, 0);
于 2013-03-16T10:36:18.057 に答える
0

エラー メッセージは、何が問題なのかを示しています。

CURLOPT_FOLLOWLOCATIONsafe_mode が有効な場合、または open_basedir が設定されている場合はアクティブ化できません

次の方法で現在の構成を取得できるはずです。

var_dump(array_map('ini_get', array('safe_mode', 'open_basedir')));

エラーを解消するには、ホスティング会社のサポート部門に連絡し、PHP 設定の技術的要件を伝えてください。ホスティング業者が要件を満たすことができない場合は、PHP スクリプトに対して間違ったホスティング業者を選択しています。

于 2012-04-13T09:30:49.540 に答える