file_get_contents和Curl无法使用Heroku FREE

时间:2014-01-02 08:55:32

标签: php .htaccess curl heroku file-get-contents

编辑4:

如果您使用免费版的heroku(使用一个网络dyno),这只是一个问题,我在下面做了一个解决方法。但这仍然是一个有效的问题,所以我不确定投票的原因是什么......

这适用于本地和其他网站。

下面.htaccess适用于索引,但是当像“类别/戏剧”一样访问“subdir”/ mod_rewrite目录时,我得到的是“应用程序错误”

修改

所以我所做的是,而不是通过.htaccess进行所有重写。我将这样的每个请求发送到http://example.com/CatX/CatY/CatZ/ http://example.com/redirs.php?data=CatXCatYCatZ。然后在redir我获取页面并输出它,但这只会给heroku上的应用程序错误,并且检查日志更加令人困惑,因为它报告未能先获取请求然后继续获取它。

问题网址示例:http://movie-nights.herokuapp.com/category/Crime/

我只有免费的插件和基础包。我也试过curl但是没有输出数据应该是通过curl获取的 - 空结果但是redirs.php有效。

“应用程序错误”

“应用程序出错,无法提供您的网页。请稍后再试。

如果您是应用程序所有者,请查看日志以获取详细信息。“

RewriteEngine on
RewriteBase /

RewriteRule ^(.*)/css/(.+)$ css/$2 [L]
RewriteRule ^(.*)/bilder/(.+)$ %{SCRIPT_URI}bilder/$2 [L]
RewriteRule ^(.*)/grafik/(.+)$ grafik/$2 [L]
RewriteRule ^(.*)/js/(.+)$ %{SCRIPT_URI}js/$2 [R]
RewriteRule ^(.*)/lightbox/(.+)$ %{SCRIPT_URI}lightbox/$2 [L]
RewriteRule ^(.*)/bootstrap/(.+)$ bootstrap/$2 [R]

RewriteRule ^FAQ(/)*$ %{SCRIPT_URL}faq.php [L]
RewriteRule ^MovieDescription/$ %{SCRIPT_URL}xxx/xxx.php [L]
RewriteRule ^stream/url\=(.+)$ $1 [R]

RewriteRule ^id/([0-9]*)$ id/$0/ [L]
RewriteRule ^id/([0-9]*)/(.*)$ id/$0/ [L]

RewriteCond %{REQUEST_FILENAME} !-f            #<-- here
RewriteRule ^(.*)/$ redirs.php?data=$0 [QSA]   #<-- here

redirs.php

<?php
function makeUrl($attr, $url) {
    if (preg_match('#\?#', $url)) {
        $attr = '&'. $attr;
    } else {
        $attr = '?'. $attr;
    }
    return $attr;
}

function getWebCwd() {
    $dir = '';
    if (!empty($GLOBALS['BaseCat'])) {
        $dir = $GLOBALS['BaseCat'];
    }
    if (!empty($GLOBALS['subUrl'])) {

        // Can be for example:
        //$subUrl = 'Streamed-Movies/';
        $dir .= $GLOBALS['subUrl'];
    }
    return $dir;
}

$url = '/index.php';
$data = $_GET['data'] . getWebCwd();

if (preg_match('#category\/([a-zA-Z]+)#iu', $data, $matches)) {
    $url .= makeUrl('category='. $matches[1], $url);
}
$sid = session_id();
if (!empty($sid)) {
    $url .= makeUrl(session_name() .'='. $sid, $url);
}
$url = 'http://'. $_SERVER['SERVER_NAME'] . $url;
$opts = array('http' => array(
    'method' => "GET",
    'header' => "Accept-language: en\r\n" . "Cookie: ".session_name()."=".session_id()."\r\n" ) 
);
$context = stream_context_create($opts);
session_write_close();   // this is the key
$html = file_get_contents($url, false, $context);       // <-- line 92  
echo $html;

来自Papertrail插件的错误日志:(请求的网址是当前的,如果您尝试打开它,则有效)

Jan 02 00:40:49 movie-nights app/web.1:  [Thu Jan 02 08:40:49 2014] [error] [client 10.34.132.2] PHP Warning:  file_get_contents(http://movie-nights.herokuapp.com/index.php?category=Crime&PHPSESSID=c54qgv6pgj2mme2is32qljs865): failed to open stream: HTTP request failed! HTTP/1.1 503 Service Unavailable\r\n in /app/www/redirs.php on line 92 
Jan 02 00:40:49 movie-nights app/web.1:  10.34.132.2 - - [02/Jan/2014:08:40:19 +0000] "GET /category/Crime/ HTTP/1.1" 200 - 
Jan 02 00:40:50 movie-nights app/web.1:  10.34.132.2 - - [02/Jan/2014:08:40:49 +0000] "GET /index.php?category=Crime&PHPSESSID=c54qgv6pgj2mme2is32qljs865 HTTP/1.1" 200 16864 

所以它试图打开http://movie-nights.herokuapp.com/index.php?category=Crime&PHPSESSID=c54qgv6pgj2mme2is32qljs865 =&GT; :无法打开流:HTTP请求失败! HTTP / 1.1 503服务不可用

=&GT;但如果你试图手动打开它,它的工作原理。

EDIT2

我也得到了这个错误(下面)但是从我读过的内容来看,这应该不是问题吗?

Jan 11 23:05:21 movie-nights app/web.1:  [Sun Jan 12 07:01:38 2014] [error] server reached MaxClients setting, consider raising the MaxClients setting 

EDIT3

请在下面的答案中查看解决方案!

2 个答案:

答案 0 :(得分:2)

看起来您的代码正在接收请求,然后向您的服务器打开一个新的HTTP请求。不幸的是,您只能处理这么多并发请求,并且阻止了所有工作者(因此MaxClients错误)。这导致从Web应用程序中回调到Web应用程序失败(使用503,不可用)。

如果您确实想要重定向用户,则应返回一个3XX状态代码,其中包含您要重定向到的新网址。这将结束当前请求,返回重定向,用户的浏览器将获取新URL。

答案 1 :(得分:0)

我终于找到了解决方案!在redirs.php中我做了这个而不是curl或file_get_contents(url),其中url是一个相对网址,如/index.php?asf=123&b=3

$file = convUrlToGet($url);
$html = include_once($file);

function convUrlToGet($url) {
    $get = explode('?', $url);
    $file = str_replace('/', '', $get[0]);
    $get = $get[1];
    $gets = explode('&', $get);
    foreach ($gets as $g) {
        $g = explode('=', $g);
        $key = $g[0];
        $value = $g[1];
        $_GET[$key] = $value;
    }
    return $file;
}