0

私はメーリングリストを持っており、定期的に情報を送信しています。このメーリング リストは大きくなりすぎて、あまりにも多くの接続が開かれ、サーバーにアクセスできないため、コマーシャル タイムに送信するには大きすぎます。そこで、夜間 (午前 4 時) に送信予定のニュースレターがあるかどうかを確認し、ある場合は送信する PHP ファイルを呼び出す bash スクリプトを作成しました。
バッシュスクリプト

#!/bin/sh
senddate=$(date +"%Y-%m-%d")

url=https://www.my.url/check_to_send_maillist.php?date=$senddate\&autosend=1

wget -O /my/log/dest.log --http-user=myuser --http-password=mypass $url

PHP スクリプト

$date=$_GET["date"];
if($date<>""){
$sql="select newsletters_id from " . TABLE_NEWSLETTERS . " where send_date='" . $fecha . "'";
$nid=executequery($sql);
if($nid<>""){
    $url="https://www.my.url/send_newsletter.php?page=1&nID=%s&action=confirm_send&autosend=1";
    $url=sprintf($url,$nid["newsletters_id"]);
    header('location:' .$url);
}   
}

テストは問題なく、すべてうまくいきました。実際のメーリング リストで使用すると、PHP スクリプトがニュースレターを送信する URL を 3 回呼び出したため、顧客はニュースレターを 3 回受信しました。私のメーリング リストには約 40,000 のアドレスがあります (外部サービスを使用する必要があることはわかっています)
Apache ログ
-BASH SCRIPT
server_ip - http_user [14/Dec/2012:04:00:02 +0100] "GET /check_to_send_maillist.php?date=2012-12-14&autosend=1 HTTP/1.0" 302 - "-" "Wget/1.10.2"
-PHP SCRIPT

 server_IP - http_user [14/Dec/2012:04:04:59 +0100] "GET /my_send_script.php?page=1&nID=nid&action=confirm_send&autosend=1 HTTP/1.0" 200 21454 "-" "Wget/1.10.2"
server_IP - http_user [14/Dec/2012:04:20:01 +0100] "GET /my_send_script.php?page=1&nID=nid&action=confirm_send&autosend=1 HTTP/1.0" 200 21454 "-" "Wget/1.10.2"
server_IP - http_user [14/Dec/2012:06:05:38 +0100] "GET /my_send_script.php?page=1&nID=nid&action=confirm_send&autosend=1 HTTP/1.0" 200 268 "-" "Wget/1.10.2"

ヘッダーの場所がスクリプトを複数回呼び出すのはなぜですか? 強制的に 1 回だけ電話をかけるにはどうすればよいですか? 別の方法でそれを行うための提案はありますか?

どんな助けでも大歓迎です

4

1 に答える 1

0

問題の理由および/または解決策を探していたホールデイの後、私はそれを見つけました。デフォルトでは、タイムアウトが発生した場合、WGET は URL を開こうと 20 回試行します。電子メールを送信するスクリプトがタイムアウトを与えていたため、WGET が何度も試行されました。

WGET コマンドを次のように変更しました。

WGET -tries=1 -T 4 http://www.my.url/my/script.php

--tries=1 は、タイムアウトが発生した場合でも、WGET にスクリプトを開く試行を 1 回だけ強制します。
-T 4 タイムアウトを 4 秒に設定

そしてうまくいきました。

助けてくれてありがとう。

于 2012-12-14T18:21:01.743 に答える