PHPのcURLスクリプトは、戻り文字列を出力するときに2回実行されます

私は次のスクリプトを持っています。リモートPHPスクリプトでは、レコードがデータベーステーブルに追加されます。 このスクリプトに最後の行(print $ html;)を残すと、2つのレコードが追加されます。

その行を省略すると、レコードが1つだけ追加されます。しかし、私は明らかに何の出力もありません。

出力をファイルに書き込むと、レコードが1つだけ追加されます。出力はhtmlページです。

<?php
  $ch = curl_init();

 //set URL and other appropriate options
  curl_setopt($ch, CURLOPT_URL, 'http://somedomain.nl/some.php?PARAMS=blabla');
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

 //cookie settings
  curl_setopt($ch, CURLOPT_COOKIEJAR, 'some.txt');
  curl_setopt($ch, CURLOPT_COOKIEFILE, 'some.txt');

 //set data to be posted
  curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);

 //perform the request
  $html = curl_exec($ch);

 //close the connection
  curl_close($ch);

  print $html;
?>

助言がありますか?

Gr。漢

/ * *アップデート

 

これは$ htmlのスニペットです。ページ全体がかなり大きくなります。 htmlの部分文字列を表示すると、スクリプトは2回目の実行時に '

@Poonam:ob_clean_end()の後に$ htmlを出力すると、2番目のレコードが追加されます。

今のところ私は非常に粗悪な回避策を実装しています。レコードにタイムスタンプがあるので、最後のレコードが少なくとも1秒前でない場合は、2番目のレコードが追加されないようにします。私はそれが嫌いですが、今のところうまくいきます。

Gr。漢

/ * *アップデート

この問題はcURLからは出ません。同じことをfile_get_contentsで試しても同じことが起こります。

たぶん私が使用しているmod_rewriteに原因があります。

Gr。漢

/ * *アップデート

おそらくmod_rewrite。 rewrite-rulesの代わりに直接URLを使用すると、期待どおりに動作します。

これらは私が使っている書き換えルールです:

RewriteEngine On
RewriteRule ^zoek/(.*)$ parts.php?PARAMS=$1 [L]

Parts.phpは上記のスクリプトです。

Gr。漢

2
こんにちは@HanTimmers、最後に解決策を見つけましたか?私は同じ問題を抱えている、カールは2回実行され、なぜ私は理解していない。
追加された 著者 MeV,
$ html 変数の内容を表示できますか?
追加された 著者 DaveRandom,
@Poonam現在のコードでリモートURLが2回呼び出される理由はありません。おそらく2つのレコードがDBに挿入されているのでしょう。出力バッファリングを追加しても問題は解決されません。単にメモリ使用量が増加します。私は上記のスクリプトが2回呼び出されていると思うし、私は理由を知っていると思うので、私はHTMLを見るように依頼している。
追加された 著者 DaveRandom,
@HanTimmers本当にページ全体を見ることができました。そうしないと pastebin に投稿できますここに置いてください。私が探しているものは、 <script> タグが空の src = タグ空の href = src = <link>
追加された 著者 DaveRandom,
@プアナムは、それが彼の解決策になると思うので、答えとして書いてください。 $ htmlは関数への参照を取得して再実行するようですが、ドキュメントはそのような可能性のある動作を示唆していません。
追加された 著者 davidethell,
正確にはわかりませんが、curl_exec($ ch)をvaribleの印刷データに格納し、次にprintを書くときに2回目にob_start()を実行するのを避けるために、 curl_exec($ ch); $ html = ob_get_contents(); ob_end_clean();
追加された 著者 Poonam,
更新された質問。
追加された 著者 Han Timmers,

1 答え

CURLOPT_RETURNTRANSFERをfalseに設定し、$ html = curl_exec($ ch)の代わりにcurl_exec($ ch)を実行します。その後、カールの出力は直接ブラウザに返されます。

1
追加された
上記のコードではこれは悪い考えではありませんが、問題を修正するつもりはありません。
追加された 著者 DaveRandom,
これは私のために働いた、ありがとう!私はPHPプロセスを2回実行していました。
追加された 著者 DeZeA,
私は恐れているDaveRandomが正しいです、これは違いはありません。
追加された 著者 Han Timmers,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com