Использование curl для загрузки xsl-страницы возвращает фактическую ошибку количества элементов - PullRequest
2 голосов
/ 13 мая 2011

у нас есть приложение DITA XML, которое на лету создает xhtml и при просмотре в браузере выглядит нормально.

Пример URL: http://livecontent.jordanpublishing.co.uk/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4

Scrrenshot of our application

Если я пытаюсь загрузить URL с помощью curl, я получаю следующую ошибку:

Error checking function parameter 3 in call transform:transform($fDoc, LiveContent-UI:get_xsl("ui/ui_skin.xsl", ""), LiveContent-UI:get_xsl_params(untyped-value-check[xs:string, $skin], $extra_params)): The actual cardinality for parameter 1 does not match the cardinality declared in the function's signature: LiveContent-Util:browser_from_user_agent($a as xs:string) xs:string. Expected cardinality: exactly one, got 0.

XQuery Stack TraceLiveContent-Util:browser_from_user_agent(xs:string)   161:55
LiveContent-UI:get_xsl_params(xs:string, node())    145:25
LiveContent-UI:get_html(xs:string, xs:string, node(), node())   313:25
LiveContent-Pub:home(xs:string, xs:string, xs:string)   65:17
Java Stack Trace:Class Name Method Name File Name   Line
org.exist.xquery.DynamicCardinalityCheck    eval    DynamicCardinalityCheck.java    80
org.exist.xquery.Atomize    eval    Atomize.java    66
org.exist.xquery.UntypedValueCheck  eval    UntypedValueCheck.java  75
org.exist.xquery.DynamicTypeCheck   eval    DynamicTypeCheck.java   61
org.exist.xquery.FunctionCall   eval    FunctionCall.java   185
org.exist.xquery.AbstractExpression eval    AbstractExpression.java 61
org.exist.xquery.PathExpr   eval    PathExpr.java   241
org.exist.xquery.AttributeConstructor   eval    AttributeConstructor.java   95
org.exist.xquery.ElementConstructor eval    ElementConstructor.java 212
org.exist.xquery.AbstractExpression eval    AbstractExpression.java 61
org.exist.xquery.PathExpr   eval    PathExpr.java   241
org.exist.xquery.ElementConstructor eval    ElementConstructor.java 271
org.exist.xquery.AbstractExpression eval    AbstractExpression.java 61
org.exist.xquery.PathExpr   eval    PathExpr.java   241
org.exist.xquery.DebuggableExpression   eval    DebuggableExpression.java   56
org.exist.xquery.DebuggableExpression   eval    DebuggableExpression.java   63
org.exist.xquery.LetExpr    eval    LetExpr.java    208
org.exist.xquery.BindingExpression  eval    BindingExpression.java  158
org.exist.xquery.AbstractExpression eval    AbstractExpression.java 61
org.exist.xquery.PathExpr   eval    PathExpr.java   241

и я совершенно не понимаю, что происходит не так.

Код PHP Curl выглядит следующим образом:

$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL, 'http://onlineservices.letterpart.com/sitemap.xml;jsessionid=1j1agloz5ke7l?id=1j1agloz5ke7l');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);

$xml = new SimpleXMLElement($data);
foreach ($xml->url as $url_list) {
    $url = $url_list->loc;
    echo $url ."<br>"; 
    //file_get_contents($url);




    echo $url ."<br>";   
    $ch = curl_init($url); //load the urls
                    echo $url ."<br>";  
            curl_setopt($ch, CURLOPT_TIMEOUT_m2, 20); //No need to wait for it to load. Execute it and go.
            curl_exec($ch); //Execute
            curl_close($ch); //Close it off 

Кто-нибудь может помочь? Я немного растерялся, так как это далеко от моего набора навыков.

Спасибо

EDIT:

Было предложено добавить агента пользователя, поэтому я добавил следующее:

curl_setopt ($ ch, CURLOPT_USERAGENT, «Mozilla / 4.0 (совместимо; MSIE 5.01; Windows NT 5.0)»);

Теперь я получаю следующую ошибку в моих журналах:

[13-May-2011 16:30:14] PHP Notice:  Use of undefined constant CURLOPT_TIMEOUT_m2 - assumed 'CURLOPT_TIMEOUT_m2' in /home/digital1/public_html/dev/sitemap.php on line 43
[13-May-2011 16:30:14] PHP Warning:  curl_setopt() [<a href='function.curl-setopt'>function.curl-setopt</a>]: Invalid curl configuration option in /home/digital1/public_html/dev/sitemap.php on line 43

Здесь две строки (43):

curl_setopt($ch, CURLOPT_TIMEOUT_m2, 20); //No need to wait for it to load. Execute it and go.

Мне, кажется, повезло больше, используя агента Googlebot:

Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

как на самом деле я получаю контент, записанный на экран, но мои журналы все еще показывают эти ошибки.

1 Ответ

3 голосов
/ 13 мая 2011

Я предполагаю, что ваше Java-приложение ожидает установки заголовка User-Agent. Поскольку Curl не отправляет заголовок User-Agent по умолчанию, вам необходимо установить его. Попробуйте добавить это выше вашего параметра, чтобы установить CURL_TIMEOUT_m2.

curl_setopt($ch, CURLOPT_USERAGENT, "PHP/".PHP_VERSION );

Если по какой-то причине ей не нравится эта строка User-Agent, вы можете попробовать использовать ее в реальном браузере.

EDIT:

Согласно вашему редактированию, это связано с тем, что вы указали постоянную времени ожидания curl. Это должно быть CURLOPT_TIMEOUT_MS, а не CURLOPT_TIMEOUT_m2.

...