• 締切済み

◆バックエンド処理の終了を知りたい。

いつもお世話になっております。 ある処理で重たい部分をバックエンド側に送っています。(/path/index.php) $cmd = '/usr/local/bin/php /path/test.php '. $q_str1 .' '. $q_str2 .' > /dev/null &'; exec($cmd); test.php内で処理が完了した場合に元の画面へ知らせる方法などあるのでしょうか? 今はしょうがないので、(/path/index.php)の完了画面に「ボタン」を設け、何分か経過後任意に押下すれば、 (/path/to/test.php)の結果を取得するというアナログ(?)な方法をとっています。 以下はtest.phpの処理後に書いた1行です。馬鹿げたもので勿論動作しませんが、希望はこんな感じです(汗)。。。 header( "Location: "."http://". $SERVER_NAME ."/path/index.php?id=FromBack" ); exit; バックエンドでの処理終了後、結果を表示させたい。 PHPだけで可能でしょうか? もう1つ。 バックエンド側に渡す時に引数も渡しているのですが、$argv内で4つまでしか配列が取れず、5つめ以降は以下のように4つめで結合して取得されます。 [argv] => Array ( [0] => /path/index.php [1] => q_str1 [2] => q_str2 [3] => q_st3q_str4q_str5 ) これはargvの制限なのでしょうか? 以上、宜しくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数0

みんなの回答

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.4

JavaScriptで非同期に並列でやるとして簡単に考ると、 ------ download.php // 1URLをDLするページ search.php // DLしたものを検索 ------ 検索ボタンを押下。 1000回非同期にdownload.phpにリクエスト。 1000回レスポンスがたまればsearch.phpにリクエスト。 検索結果を表示。 ------ DLする時に以前と更新日が同じものは内容まではDLしないとか 何日以内にDLしていればDLしないとかすれば多少は速くなるでしょうけど、 目的が検索エンジンの類ならまぁ仕様はいまいちですね。

  • altrn
  • ベストアンサー率62% (10/16)
回答No.3

たとえば本体として、 <div id="display"></div> を用意し、読み込むファイルを <?php sleep(10); echo '完了'; ?> として用意するとします。ここで何か送信ボタンを押すと <div id="display">読み込み中</div> にかわり(ページのリロードはありません。画面の一部がリロードされる感じでしょうか。)、さらに十秒後に <div id="display">完了</div> が得られるような、そのようなことを可能にする仕組みです。 ただし、ある程度Javascriptの知識が必要になりますので、いろいろと時間がかかるかもしれません。 ですのでむしろ、この場合フレームをうまく工夫して使うと手軽でいいかもしれません。

  • altrn
  • ベストアンサー率62% (10/16)
回答No.2

execやsystemなどで > /dev/null をつけると、実行したあと即座に次の行に進むようですので、実行した向こう側で何が起こったかなどは一切わかりません。 $hoge=exec(....); などとすれば何か結果を得ることが可能ですが、こうすると実行した向こう側の処理が終わるのを待つので結局バックグラウンドでの処理ではなくなってしまいます。 「完了したことを元の画面へ知らせる」必要があるのであれば、 ajaxなどを試してみたほうがやりたいことができるのではないかと思いますが、どうでしょうか...

gogovamos
質問者

補足

>ajaxなどを試してみたほうが... PHPをかじりたてでして、ajaxは名前しか。。。 どういった事が可能なのかイメージだけでも教えて頂けないでしょうか。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

前回のつづき? execでコマンド実行しても、非同期じゃないのでなんら高速化に つながらないのでは? 前回もかきましたが、cronなどの定期処理でwgetをあらかじめ 実行しておき、その結果をテキストで取っておけばよいのでは? 処理の終了時点で、最終更新日時をログにおとしておけば、 それを見て更新済みかどうか判断できるので。

gogovamos
質問者

補足

>前回のつづき? はい。。。 >execでコマンド実行しても、非同期じゃないのでなんら高速化に >つながらないのでは? 前回、バックエンドで実行する前は、file関数で1000行以上を処理する場合、2分以上かかり、httpのレスポンスがタイムアウトしてしましまいたが、同じ処理をバックエンドで実行すると問題なくスムーズに処理できました。 >cronなどの定期処理でwgetをあらかじめ実行しておき.. あらかじめには実行はしたくありません。 処理に多少時間がかかっても、「入力→検索実行→結果一覧取得」の流れはセットにしたいのです。 今回の質問は、検索実行が終了後『何らか』のタイミングで処理終了を取得し、自動で検索一覧が取得できないかと考えています。 質問でも書きましたが、完了画面の「ボタン」を押下すれば、一覧が取得完了した場合は取得できるプログラムは完成したのですが、もっとスマートなやり方が存在するのかと思いました。

関連するQ&A

  • jQueryの.loadで読み込んだphpについて

    現状、以下のディレクトリ構造です。 /hoge/aaa/index.html(★) /hoge/bbb/index.html(★) /hoge/ccc/index.html(★) /hoge/test.php ★印のhtml内部でそれぞれ jQuery("#target").load("/hoge/date.php"); と書いてphpを読み込み、 出力結果をそれぞれのhtmlにある#target内表示させようとしています。 一方、test.php内部ではURLに /aaa/があったら、 /bbb/があったら、 /ccc/があったら、 「■■■■■」するという処理を書いて、応じた値を表示しようと考えています。 ここで問題が発生するのですが、 test.php内部で、 $pageurl = $_SERVER["REQUEST_URI"]; こう記述して値を取っても、phpが置かれている場所である 「/hoge/test.php」 を取得するだけで、htmlが置かれているパスは取得できませんでした。 .loadした場合のphpでは、 読み込み先のhtmlのURLなどをphp側で取得させる事はできないのでしょうか。 うまく説明できていないかもしれませんが、 ご助言いただけますとありがたいです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • bat内での文字の置き換えについて

    環境変数に設定されている値を"と\を\でエスケープを行い、javaのクラスに渡したいです。(環境変数にはあらゆる英数記号がはいる可能性があります) set str=%TEST_PATH:\=\\% set str2=%str:"=\"% ↑という処理を行うことで、変換が出来る事はわかりましたが特殊記号が入った場合にうまく動きません。 又、"が先頭にある場合とそれ以外の場合だと挙動が異なる事に気づきました。 "が先頭にある場合は%TEST_PATH:\=\\%を"で囲むとエラーになり、それ以外では囲まないとエラーになるのはなんででしょうか? 理由と解決策を教えてください。 ~~~作成物~~~ 2つの値を環境変数に設定した場合。(「<>"&|,'\」などと設定するとうまくいかないです) TEST_PATH="<>\ TEST_PATH2=<>"\ ~~~bat~~~ @echo off echo start1 set str=%TEST_PATH:\=\\% echo %str% set str2=%str:"=\"% echo %str2% echo start2 set str="%TEST_PATH2:\=\\%" echo %str% set str2=%str:"=\"% echo %str2% echo end

  • プログラムについて

    いつもお世話になっております。 以下のようなPerlのプログラムがあるのですが、 何の処理を行っているのかよく分かりません。 分かる方がいらっしゃれば、教えて頂けますでしょうか? (プログラム内容) $param{back} =~ /^\d+$/ or $str =~ s/<!--back start-->.+<!--back end-->//g; この処理は、$param{back} =~ /^\d+$/の結果により、 以下の処理を行うという意味なのでしょうか? 数字から始まる文字である → 何もしない。 数字から始まる文字でない → $str =~ s/<!--back start-->.+<!--back end-->//gの処理をする。 以上です。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • vbaの繰り返し処理について

    vbaです。 Sub Test1() Dim Str As String Dim Pnt1 As Long Dim Pnt2 As Long Str = Range("A1") Pnt1 = InStr(Str, "重 http://") If Pnt1 <= 0 Then Exit Sub Pnt2 = InStr(Pnt1, Str, "要") If Pnt2 <= 0 Then Range("B1") = Mid(Str, Pnt1 + 2) Else Range("B1") = Mid(Str, Pnt1 + 2, Pnt2 - (Pnt1 + 2)) End If End Sub という式でA1からA2.A3と下にURLが入っており空欄になるまで同じ処理をしたいのですがどのように変更すれば作動しますでしょうか?

  • whileで処理した結果を別々の変数に入れる方法

    以前(といっても1週間前ぐらいですが)、 「whileで処理した結果を変数に入れる方法」で質問させていただきました。 解決したプログラム: <?php $a=5; $str=""; while ($a > 0) { $str.=$a; $str.="\n"; $a--; } print "結果:".$str; ?> 今度は同じ変数に格納するのではなく、 別々の変数に格納したいのですが、どうすればいいのでしょうか? printするときに上記のプログラムでは、 「print "結果:".$str;」となっていますが、私が実行したいのは 「print "結果:"$str1 . $str2 . $str3 . $str4 . $str5;」のような感じです。 whileしながら新しい変数を作ることはできるのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 加減剰余のオーバーフローについて

    今C言語で加減剰余のプログラムを作っていて、 オーバーフローのチェックだけが上手くいきません。 limits.hをインクルードして、オーバーフローのチェック を行いたいのですがどうすればよいのでしょうか? 扱いたい範囲はint型の-2147483648~2147483647です。 ちなみに開発環境はvc++2005です。 一応ソースを載せておきますので、よろしくお願いします。 #pragma warning ( disable : 4996 ) #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <limits.h> int main ( int argc, char *argv[] ) { int start; // 最初に入力する値(引数1) int end; // 最後に入力する値(引数3) int kekka; // 計算結果を格納 int amari; // 除算の余りを格納 int max = INT_MAX; // 表すことが出来る最大値 int min = INT_MIN; // 表すことが出来る最小値 char enzansi; // 入力する演算子 (引数2) char str1[512]; // 格納用の配列を宣言(start用) char str2[512]; // 格納用の配列を宣言(end用) /* 引数の個数チェック */ if ( argc != 4 ) { printf ( "usage : %s start enzansi end\n", argv[0] ); exit ( 0 ); } /* 引数を取得して整数型に変換 */ start = atoi ( argv[1] ); end = atoi ( argv[3] ); /* 引数の取得 */ enzansi = ( argv[2][0] ); sprintf ( str1, "%d", start ); // str1に値を格納 sprintf ( str2, "%d", end ); // str2に値を格納 /* str1とargv[1]による文字列の比較 */ if ( strcmp ( str1, argv[1] ) ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( 0 ); /* str2とargv[3]による文字列の比較 */ } else if ( strcmp ( str2, argv[3] ) ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( 0 ); /* argv[2]が2文字以上の場合 */ } else if ( strlen ( argv[2] ) >= 2 ) { printf ( "error : 演算子を正しく入力して下さい。\n" ); exit ( 0 ); } /* 入力された演算子の条件ごとに計算 */ if ( enzansi == '+' ) { kekka = start + end; } else if ( enzansi == '-' ) { kekka = start - end; } else if ( enzansi == '*' ) { kekka = start * end; } else if ( enzansi == '/' ) { /* startの値を0で除算する場合 */ if ( end == 0 ) { printf ( "error : 0による除算は禁止です。\n" ); exit ( 0 ); } kekka = start % end; // 剰余を求める /* 割り算の結果として余りが出なかった場合 */ if ( kekka == 0 ) { kekka = start / end; printf ( "%d %c %d = %d", start, enzansi, end, kekka ); exit ( 0 ); /* 割り算の結果として余りが出た場合 */ } else if ( kekka != 0 ) { kekka = start / end; amari = start % end; printf ( "%d %c %d = %d余り%d", start, enzansi, end, kekka, amari ); exit ( 0 ); } /* 入力された演算子が異なる場合 */ } else { printf ( "error : '+' '-' '*' '/'のいずれかの演算子を入力して下さい。\n" ); exit ( 0 ); } /* 数値1 演算子 数値2 = 演算結果の形式で出力する */ printf ( "%d %c %d = %d", start, enzansi, end, kekka ); exit ( 0 ); } もし変な部分がありましたら指摘お願いします。 一応四則演算は問題なくできます。

  • パラメターを複数リストアップし順番に処理

    現在、以下のコードでcall1を呼び出して処理している。 Sub main() sub call1 FPath,SearchStr end sub パラメターのSearchStrを事前に複数リストアップして 順番に一つずつ読み込ませて自動で処理させるVBAのコードを以下のように卓上で考えてみました。 こんな感じで良いのでしょうか ? (卓上の案なので実際に試してはいません。) 改良案や別案など アドバイスいただければ嬉しいです。 Sub main() Dim FPath As String Dim SearchStr As Variant ' Set the folder path folderpath = "C:\TEST" SearchStr = Array("SearchString1", "SearchString2", "SearchString3") For Each str In SearchStr Call call1(FPath, str) Next str End Sub

  • javascriptとphpの変数のやり取り

    ある該当ページ(mtの検索結果ページ)が拡張子をphpにできず、 <script src=hogehoge.php></script>でphpファイルを読み込んで、 実行したいと思います。 phpを使用している理由はある変数を取得したいのですが、 今回は関係ないので割愛します。 ■以下ソース ・該当ページ(mt-search.cgi) <html> <head> <title>hoge</title> <script type="text/javascript" src="/hogehoge.php"></script> </head> <body> <script> document.write("<p>"+str+"</p>"); </script> </body> </html> ・phpファイル(hogehoge.php) <?php if(test == test){ $str = "成功" }else{ $str = "失敗"; } ?> <script type="text/javascript"> <!-- var str= "<?php echo $str?>"; --> </script> このようにしているのですが、 うまく出力されません。 php側の出力はうまくいっているようなのですが、 ブラウザ側の方でちゃんと変数がわたっていないようです。 画面は真っ白です。 ご教授お願いいたします。

  • PHP+SSI

    「index.php?a=100」のようなページをSSI(ssi.shtml) から実行したいと考えています。 ところがssi.shtml内で <!--#exec cmd="index.php 100"--> とし index.php内で引数渡しの設定として「$argv[0]」として ますが、ssi.shtmlを実行しても実行結果を返さずブランクに なってしまいます。index.phpのパーミッションも実行可能に 設定しているのですが…。  上記以外の方法でも結構ですので、SSIで引数付きのPHPを 実行する方法をご存じの方がいらっしゃいましたら、教えて ください。 Apache 1.3.31+PHP 4.3.1で動いています。もちろんSSIで #execがNGなんてオチも有りません。 なお、下記URLによればSSIからの引数渡し自体はCGIだと可能の ようですが…。 http://tohoho.wakusei.ne.jp/wwwssi.htm#Exec

    • 締切済み
    • PHP
  • PHP内でJavaScriptの処理は可能?

    PHP内変数 $flag をJavaScriptで参照し、条件処理を行っています。 JavaScriptの処理は onClick() のタイミングで行います。 ソースの概要は以下のようになります。 1.ログインしているか見る(flagでチェック、1はログイン中…) 2.flagのデータ取得、条件処理。 3-1. flagが1以外なら、true処理 3-2. flagが1なら、false処理  ・  ・ と、こんな処理を行いたいのですが…上手く出来ません。 ソースは以下になります。PHP側の変数 "$flag" までの取得は上手く出来たのですが、 JavaScript側の処理で、つまづいてます…。 で、表題にもあるようにPHP内でJavaScriptの処理は可能でしょうか? アルゴリズム的に、アドバイスなどありましたらご教授ください。 以下が主要部分のソースになります。 <?php echo("<script Language='JavaScript'> "+ "<!-- "+ "function check(){ "+ "if($flag != '1'){ "+ "return true; "+ "} "+ "else{ "+ "header('Location: ./error.html'); "+ "exit(); "+ "return false; "+ "} "+ "} "+ "//--> "+ "</script> "); echo(" <a href='test.html'><img src='botton.gif' onClick='check()' "> アドバイスお願い致します。

    • 締切済み
    • PHP