スレッド表示 | フラット表示〕 全トピック 920 件中 186 番目 次≫ ≪前

windowsでバックグラウンド実行

created: 2006-09-26 20:02 | modified: 2006-09-29 13:48 | reply: 5

[3381] windowsでバックグラウンド実行

user: 濃い味 | created: 2006-09-26 20:02
初めまして。濃い味と申します。

Windows環境において、バックグラウンドでバッチとして
phpを実行するための手段を探しております。

unix環境では、
$cmd = "/usr/local/bin/php xxx.php >> xxx.log 2>&1 &";
shell_exec($cmd);

てな感じで実現できますが、これをwindows環境で実現したいのです。

ネット等で調べ、つくったサンプルは以下です。
http://localhost/aaa.php を実行すると、
sleep(10) が終わるのを待ってから、ブラウザに"OK"が
表示されます(待たずに"OK"を表示させたい)。

環境は以下のとおりです。
OS: Windows Server 2003
Apache: 2.0.59
PHP: 5.1.6

よろしくお願い致します。

=========================================
aaa.php (bbb.batを起動)
=========================================
<?php
$cmd = '"C:\Program Files\Apache Group\Apache2\htdocs\bbb.bat" 2>&1 &';
shell_exec($cmd);
echo "OK!";
?>


=========================================
bbb.bat (ccc.phpを呼び出すバッチ)
=========================================
cmd.exe /c start c:\php\php.exe "C:\Program Files\Apache Group\Apache2\htdocs\ccc.php"


=========================================
ccc.php
=========================================
<?php
sleep(10);
echo "hello!";
?>
reply: 3382 返信 編集 削除

[3382] 無理矢理やってみた

user: ach | created: 2006-09-27 02:46
#include <windows>
#include <stdlib>

int main(int argc, char **argv)
{
int result;
char *newArg, *oldChar;
if (argc < 2) { return 1; }

//引数を再構成
newArg = GetCommandLine();
while(*newArg != ' ') newArg++; //ここはあまり正確ではない
oldChar = argv[1];
while (*newArg != *oldChar) newArg++;
while(*oldChar != 0)
{
newArg++;
oldChar++;
}

/*
* see http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpshell/html/_win32_shellexecute.asp
*/
result = (ShellExecute(NULL, "open", argv[1], newArg, NULL, SW_HIDE) <= (HINSTANCE)32);
free (newArg); //いらないかも
return result;
}
こやつをbcc32コンパイルして間にかますとバックグラウンドで動かした雰囲気が出る気がする.

名前をbackExec.exeとでも名づけて
shell_exec('backExec bbb.bat');
こんな感じ.
CreateProcessを使った方がよいのだろうけど……ってかstartをうまく使えばできないかなぁ.
これだとリダイレクトうまくできないし.
Parent: 3381  reply: 3383 返信 編集 削除

[3383] ありがとうございます

user: 濃い味 | created: 2006-09-27 09:57
ach様、レスありがとうございます。

> ってかstartをうまく使えばできないかなぁ.

そうなんですよね。
私もそれが最善かと思い、ここ数日
試行錯誤していたのですが、なかなか動いてくれなくて。

まずはstartを使う方向でもう少し粘ってみます。
無理そうだったら、ach様の案を検討させて頂きます。

結論が出ましたら、結果をご報告致します。
Parent: 3382  reply: 3384 返信 編集 削除

[3384] マルチポストは……

user: ach | created: 2006-09-27 19:12
MLにも同じ質問投げてますね……
やめた方がいいですよ.

# 向こうでも似たような回答でしたね.
# Vectorの方は私のと違って適当なつくりじゃないと思うので,
# 復活したら試してください.

## register_shutdown_functionを使うとブラウザからはバックグラウンドで作業しているように見えるかも
Parent: 3383  reply: 3385 返信 編集 削除

[3385] ごめんなさい

user: 濃い味 | created: 2006-09-28 15:02
achさん、マルチポストごめんなさい。

早急に方針を決める必要がありまして。
ルール違反ですよね。

以後、気をつけます。

まだ方針を検討中です。
決まりましたら、報告させて頂きます。

#register_shutdown_function を使ってみましたが、
#やはり終了を待ってしまいます
Parent: 3384  reply: 3386 返信 編集 削除

[3386] 見当違いだったらすみません^^;

user: ぱぴよん | created: 2006-09-29 13:48
Ajaxで非同期で動作させるというのはどうでしょうか。

クライアントサイドスクリプトだとダメなのかな^^;

◆index.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ajax</title>
<script type="text/javascript" src="./ajax.js"></script>
<script type="text/javascript">
<!--
function setGridData() {
request = new CreateHttpRequest();
request.onreadystatechange = function() {
// 受信完了(サーバから返答がきたら)
if(request.readyState == 4) {
// リクエスト成功
if(request.status == 200) {
document.getElementById('ccc').innerHTML = request.responseText;
} else {
alert(request.status + ':' + request.statusText);
}
}
}
rdm = new Date().getTime();
var uri = "work.php?"+rdm;
request.open('GET', uri, true);
request.send('');
return ;
}
//-->
</script>
</head>
<body onLoad="setGridData();">
<?php
print "OK[".date("Y-m-d H:m:s ").time()."]";
?>
<div id="ccc"></ccc>
</body>
</html>

◆work.php
<?php
sleep(10);
print "hello! [".date("Y-m-d H:m:s ").time()."]";
?>

◆ajax.js
// Ajaxオブジェクト生成
function CreateHttpRequest() {
//for Win+IE
if(window.ActiveXObject) {
try {
//for MSXML2
return new ActiveXObject('Msxml2.XMLHTTP');
} catch(e) {
try {
//for Old MSXML
return new ActiveXObject('Microsoft.XMLHTTP');
} catch(e2) {
return null;
}
}
} else if (window.XMLHttpRequest) {
//for Other browser
return new XMLHttpRequest();
}
return null;
}
Parent: 3385  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 186 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑