2016-07-28 21 views
3

。問題は、このページを手動で開く必要があるため、実際にはその背後にある実際のMySQLスクリプトを実行するようなものです。自動化PHPスクリプト

は、どのように私は、「人間」の相互作用のないサーバー上の特定の日の毎日実行するには、このファイルを追加することができます。

私のような他のソリューションのいくつか試してみました:タスクSchedularでPHPを開始 をして、-f C引数 でそれを実行している:\ Apache24 \ htdocsに\ my_phpfile.php

するただし、これはいないようでしたテーブルの情報を見ると更新されなかったため、PHPファイルを実行します。私はPHPファイルがブラウザを使ってこれを手動で実行したので動作することを知っています。

いくつかのアドバイスや助けを得ることができますか?これを行う最善の方法は何ですか?

私は現在、私の窓の上に10ラップトップを環境をテストしていますが、最終的にはこれは、Windows 2012 Server上で実行されます。

ありがとうございました。

+1

FreeBSD/Linuxユーザーはこちら。 Windowsについては考えていません。あなたのPHPがどのようにコード化されているのか分かりませんが、コマンドラインからPHPを実行できるのであれば、あなたのアプローチは正しいです。あるいは、 'curl'、' wget'や 'fetch'のようなものを使ってコマンドラインからウェブページを"呼び出す "ことができれば、代わりにそのコマンドをスケジュールすることができます。 Unixシステムの – Tigger

+0

あなたはcronjobsをすることができます、多分あなたも窓にすることができますか? ATコマンドを使用して –

答えて

2

あなたがタスクスケジューラでは、PHPスクリプトを実行します(私はそれを多くを行う)が、以下の点に注意することができます。

あなたはPHPが必要になります他、あなたのPATHに存在する必要があり

php C:\Apache24\htdocs\my_phpfile.phpとして、それを実行します

このように実行すると、WebではなくCLIモードで実行されます。 Apacheでスクリプトを実行すると、環境はCLIとはまったく異なります。環境の違いにより、スクリプトが期待どおり実行されていない可能性があります。例:

  • カレントディレクトリが異なる場合、
  • 一切の$ _SERVER変数は何の.htaccessファイルが存在しない
  • 、$ _ENVは違うだろう
  • 、存在しない、
  • ユーザーは異なりますしたがって、ファイルアクセス許可
  • 読み込まれたモジュールが異なる可能性があります
  • PHP.iniは異なる場合もあります

は単にPowerShellの、またはCMDプロンプトを開き、WTSに入れているのと同じコマンドラインを入力して、CLIでそれをテストします。問題を知らせる出力が表示される場合があります。タスクスケジューラで実行インスタンスが失敗した理由を確認するためにあなたのphp_errors.logで

ルック。

スクリプトをCLIモードで動作させることができず、Webモードで実行する必要がある場合は、wget,curlなどを使用するか、Internet Explorerのコマンドラインオプションを使用してWebスクリプトを実行できます。

http://SetCronJob.comまたは類似のサービスを使用してください。

ここにはたくさんのオプションがあります。私の心の中で「最も良い」とは、最も簡単なのはKISSの原則です。CLIでCLIを直接実行しているです。間違っていることは少なく、PHPをロードするだけでApacheを起動するのではなく、ネットワーク接続に頼るのではなく、サードパーティ(有料)のWebサービスに頼っているわけではありません。 IEが更新される危険性はありません! WTSも信頼性が高い(とにかくWindows Server上で)。

+0

ありがとうございました...どのメソッドをお勧めしますか?より良い用語の不足のために "安定した"ソリューションと呼びますか?私は実際に* .batファイルを実行するように管理して、期待される結果を返しました。 –

+0

更新された回答をご覧ください。 .batでのラッピングは一般的な方法です。これは、移植性のためにコマンドラインをカプセル化するのに役立ち、例えば、最初にCDを適切な場所に挿入することができます。その後、WTSにパラメタを付けずにバットを呼び出さなければなりません(私はそれがパスとパラメータのためにインターフェイスを握っているのがわかります)。 – scipilot

+0

私の.batファイルがうまく機能しています。私は今、メール機能を追加し、認証目的のために少しPHPMailerをハックする必要がありました。しかし、私は最初も同じ問題を経験しています。 ウェブインターフェース(例:chrome)を使用するとメールのみが送信されます。 batファイルを実行すると、メールは送信されません。ただし、データは更新されます。 –

2

schtasksユーティリティでタスクを作成して、cmdまたはpowershell(https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx)を使用してWindowsのcronジョブを作成することができます。

schtasks /Create /TN task_name /SC /MO 5 c:\php\php.exe d:\path\to\php_script.php 
+0

これは 'at 'の代わりですか? – scipilot

+0

@scipilot 'schtasks'は' at'の代用として設計されていると思います。それは、タスクの柔軟なスケジュールを含むより構文と権限が改善されています。 –

0

* .batファイルは、トリックをした:ここでは名前のタスク名は、5分ごとに実行してタスクを作成します例です。タスクスケジューラを使用してそれを蹴飛ばします。当初はバットファイルが間違ったディレクトリを指していたので、いくつかの機能が動作しなかったのです。私の次のステップは、私のコードをきれいにし、base64とhtmlを使ってメールを美しくすることです。

php C:\Apache_Directory\htdocs\my_phpscript.php 

私のスクリプト...そして、はい、私はそれが完璧な/非常にきれいではありません知っているが、それはまだ多くの仕事がありますが、今のところ、私が行うには、それを必要とするものをやっている:

<?php 

$sql1 = "USE database_name"; 

$sql2 = "TRUNCATE TABLE my_table"; 

$sql3 = "LOAD DATA LOCAL INFILE 'DataImport//import_file.csv' 
REPLACE INTO TABLE my_table 
CHARACTER SET latin1 
FIELDS TERMINATED BY ',' 
IGNORE 1 LINES 
(`record_number` 
, `module_name` 
, `action_date` 
, `location` 
, `type_of_outlet` 
, `user_name` 
, `store_code` 
, `outlet_name` 
, `line_question` 
, `line_field_id` 
, `line_value` 
, `brand_code` 
, `brand`);"; 

/* $sql4 = "SELECT COUNT(creation_time) FROM my_table 
WHERE DATE(creation_time) = DATE_SUB(CURRENT_DATE(), INTERVAL 0 DAY)"; */ 


$con=mysqli_connect("localhost","root","mysqlpassword","database"); 

if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
}; 

$result1 = mysqli_query($con, $sql1); 
$result2 = mysqli_query($con, $sql2); 
$result3 = mysqli_query($con, $sql3); 

if (mysqli_affected_rows($con) > 1) { 
    $message ="". mysqli_affected_rows($con). " rows were successfully added to the my_table table!"; 
} else { 
    $message = "" . mysqli_error($con). "has caused the update to fail"; 
}; 

echo $message; 

// To send HTML mail, the Content-type header must be set 
require("PHPMailerAutoload.php"); // path to the PHPMailerAutoload.php file. 
require("class.phpmailer.php"); 
$headers = 'MIME-Version: 1.0' . "\r\n"; 
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 

// Additional headers 
$headers .= 'To: Name1 <[email protected]>, Name2<[email protected]>' . "\r\n"; 
$headers .= 'From: Report Server <[email protected]>' . "\r\n"; 
$subject = 'Data Import Resultt' ."\r\n"; 

    $mail = new PHPMailer(); 
    $mail->IsSMTP(true); 
    $mail->Mailer = "smtp"; 
    $mail->Host = "smtp.host.co.za"; 
    $mail->Port = 587;      // 8025, 587 and 25 can also be used. Use Port 465 for SSL. 
    $mail->SMTPAuth = true; 
    $mail->SMTPSecure = 'tls'; 
    $mail->Username = "[email protected]"; 
    $mail->Password = "password"; 
    $mail->CharSet = "UTF-8"; 
    $mail->SMTPOptions = array(    // Bypass security verification on e-mail. WARNING: When using this method, 
    'ssl' => array(
     'verify_peer' => false, 
     'verify_peer_name' => false, 
     'allow_self_signed' => true 
    ) 
); 


    $mail->From  = '[email protected]'; 
    $mail->FromName = 'Reports Server'; 
    $mail->AddAddress('[email protected]', 'Name1'); 
    $mail->AddAddress('[email protected]', 'Name2'); 
    $mail->AddAddress('[email protected]', 'Name3'); 







    $mail->Subject = $subject; 
    $mail->Body  = $message."\r\n"; 
    $mail->WordWrap = 50; 

    if(!$mail->Send()) { 
     echo 'Message was not sent.'; 
     echo 'Mailer error: ' . $mail->ErrorInfo; 
     exit; 
    } else { 
     echo 'Message has been sent.'; 
    } 





mysqli_close($con); 

?> 
関連する問題