質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

362閲覧

CRONでページ遷移させることで連続処理がしたい

takeruwhite

総合スコア8

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

0クリップ

投稿2017/10/14 15:14

###前提・実現したいこと
PHPでAPIで取得したデータをデータベースにためていく機能を作っています。
キーワードリストがあり、各キーワード毎にAPIにリクエストしDBに書き込むイメージです。

一度に処理するには時間がかかり、タイムアウトしてしまいますので
ページ遷移(またはリロード)することで各キーワード毎の処理をしたいと考えています。
レンタルサーバー上で動かしていますので、タイムアウト時間を延ばして1回の処理で終わらせるのは難しいと考えています。

###困っている点・教えていただきたいこと
ブラウザ上で実行すると想定通りの動きをしますが、
CRONで実行するとページ遷移させることができず、1つ目のキーワードに対する処理で終わってしまいます。

おそらくcronで処理するにあたってヘッダー情報を送ってページ遷移させること自体が
間違っているのだろうと考えていますが、解決策にたどり着けませんでした。

なぜできないかとどうすればできるかを教えていただきたいです。

また、できれば今回行き詰っている方法にはこだわりませんので、
このような連続処理をしたい場合、どうやって実現することが一般的なのかも合わせてご教示いただければ幸いです。

###試したこと
lolipopのcronを使って、
1. page1の処理の最後にheader('location: page2.php');exit(); でページ遷移させてみる
2. javascriptで location.href でページ遷移させてみる

また、GoogleAppsScriptでトリガーを使ってUrlFetchApp.fetch(http://~~.php)を実行し上記の1と2のパターンを試してみた。

いずれもブラウザ上ではうまく動作しますが、
cronやGASのurlfetchを使った場合ではページ遷移させられず、1度目の処理で終了してしまった。

###該当のソースコード

//共通処理(うまく行ってそうなので割愛させていただきます) <?php require_once("common.php"); require_once("functions.php"); getkeyword(); //キーワードリストからリクエストしたいキーワードを取得 getApiData(); //APIにリクエスト DBwrite(); //DBに接続・書き込み updateKwlist(); //キーワードリストに処理完了フラグ・時刻など書き込み //共通の処理の最後にページ遷移させる方法を試した //試したこと1 header('location: page2.php'); exit(); //試したこと2 echo '<script type="text/javascript">location.href="page2.php";</script>';

###補足情報(言語/FW/ツール等のバージョンなど)
レンタルサーバー:lolipop ライトプラン
PHPバージョン:5.6

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1回の実行時間に制約があり、1つの処理を実行するために1回の実行では完了できない場合、途中結果を保存し、次回起動時に前回実行時の内容から再開するように実装すればよいかと思います。
現状もpage1でのページのリフレッシュ後の再開処理で同様のことをされているのであれば、それをそのまま使用することでも実現できるかと思います。
この場合、PHPのコード上でheaderの出力等でリフレッシュする必要はなく、cronやGASの次回実行時での処理再開となります。

もし処理の分割方法がpage1、page2、page3と増えていく形であれば、cronでは時間をずらして実行されればよいかと思います。
例えば各処理を1時間ごとに実行するのであれば、page1は0分から、pageは10分から、page3は20分からといった形です。
すぐに次を実行したい、ということですと、そのような場合サーバ上では常にどれかの処理が実行されていることになりますので連続実行とほぼ変わりがなく、共用サーバの性質上、運営会社からの警告等される場合もあるかと思います。
この場合は現在のサーバ上での実行ではなく、VPS等を利用されることで気兼ねなく実行できるようになるかと思います。
サーバ管理が難しいということであれば、マネージドVPS等の利用となるかと思います。

cronやGASでheader出力での処理継続がなぜできないか、についてはscsiさんのご回答にもあるようにこれらはブラウザの動きとは出力結果に対する処理の内容が一致しないからです。

cronではphpコマンドで実行していると推測していますが、phpコマンドでの画面出力をcronはブラウザのように解釈しません。通常はcronでの処理で標準出力があった場合、cron実行者へメールとして送られているものと思います。

GASのfetchは1ページの内容を取得するためのものですので、page1の出力結果を受け取った後、javascriptを解釈しません。

page1の処理の最後にheader('location: page2.php');exit(); でページ遷移させてみる

検証していないので推測になりますが、上記であればfetchがページの遷移を検知してpage2の内容を取得する動きとなり、処理が継続されている可能性もあります。
ただし、GAS自体の実行時間制限により処理を継続して行い続けることは難しいかと思います。

投稿2017/10/14 21:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeruwhite

2017/10/14 23:26

詳細な回答ありがとうございました。 もやもやとしていた複数のポイントを的確に教えていただきすっきりしました。 キーワードは増減することがあるため、キーワードリストをメンテナンスできるように、 次の処理ページはphpのプログラム上で動的に決めようとしていました。 確かに連続実行とほぼ変わらず、あまり良い方法ではなさそうです。 > 次回実行時に前回実行時の内容から再開するように実装すればよい  キーワードリストに適当なフラグを付け、 1つのプログラムの中で次に処理するキーワードの有無を判定してあれば実行するプログラムを、 短い間隔でcronで実行するようにしてみようと思います。 また、VPSについてもアドバイスありがとうございます。 APIのリクエスト制限に対応するsleep時間が長いだけで、 処理としては軽いものだと思っていましたが、共用サーバーではあまりよくないのですね。 今後やりたいことや費用面など調べて一度検討してみます。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/10/14 23:47

> 短い間隔でcronで実行するようにしてみようと思います。 1回の実行時間に対して十分大きな間隔であれば杞憂かもしれませんが、場合によっては前回の処理が実行中に次の処理が行われる可能性があります。 起動中を表すロックファイルなどを作成し、確認することで複数実行を抑止できるかと思います。 ただし、なんらかの理由で処理が異常終了した場合、この方法ではロックファイルを削除するリカバリ対応を取らないと以後の処理が全くされなくなってしまいます。 前の処理が動いていないかをプロセスの起動状況等から判断できるようであれば、そのような方法で確認するといったことも考えられるかと思います。
guest

0

ブラウザで実行しないならページ遷移出来ないのではないでしょうか?

Lollipopで出来るかは分かりませんが、
私ならSeleniumやfirefoxをサーバにinstallし、ブラウザで実際にアクセスする
または、shellが実行できるならcurlでそのphpのurlに二回アクセスする

ですかね。

投稿2017/10/14 17:18

scsi

総合スコア2840

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeruwhite

2017/10/14 23:33

回答ありがとうございます。 shellはレンタルサーバーのプランをアップグレードすればできそうです。 どういうものなのか調べてみたいと思います。 ブラウザでアクセスするという発想はありませんでした! 今の環境では難しいように見えますが目からうろこでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問