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

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

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

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

PHP

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

Q&A

解決済

3回答

1759閲覧

さくらインターネットのcronが動かない

miki0901

総合スコア14

cron

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

PHP

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

0グッド

0クリップ

投稿2018/12/08 11:54

編集2018/12/09 03:44

こんばんわ。

さくらインターネットのスタンダードプランでcronを動かそうとしていますが、うまくいきません。

test.phpからDBを更新し、メールを送る処理なのですが、
まず、動作させたいtest.phpをwww直下に配置し、ブラウザでアクセスしたところ問題なく動作しました。

そのあと、/home/XXXXX(ユーザー名)/の直下に移し、パーミッションを700に変更。

cronの「実行コマンド」欄に
「cd /home/XXXXX; /usr/local/bin/php test.php」
と記述し、5分後動作させたところ、メールもとどかず、DBもなにも変更されておりません。
「1> /dev/null」は記述していないのに、メールもとどきません。

試しに、「cd /home/XXXXX; /usr/local/bin/php tesssst.php」と、存在しないファイル名に変更し5分後動作させたところ、postmasterにメールが届き、
「Could not open input file: tesssst.php 」
と言われました。

「/usr/local/bin/php /home/XXXXX/test.php」
や、
「cd /home/XXXXX; /usr/local/bin/php /home/XXXXX/test.php」
なども試しましたが、これらもエラーメールすらとどきませんでした。

動作しない原因が分かる方、ご教授くださいm(__)m
よろしくお願い致します。

―――――――――――――――――――――――――――――――――――
追記
―――――――――――――――――――――――――――――――――――
実行されるコードを
以下のようにメール送信のみにしたところ、
「cd /home/XXXXX; /usr/local/bin/php test.php」
でメール送信が成功しました!!

PHP

1<?php 2 $header = ''; 3 // 差出人アドレス 4 $header = "From:test@XXXXX.sakura.ne.jp\n"; 5 // 返信先アドレス 6 $header .= "Reply-To:test@XXXXX.sakura.ne.jp\n"; 7 8 //------------------ 9 // 送信 10 //------------------ 11 mb_send_mail('宛先アドレス' , 'cron_test', 'message', $header ); 12?>

しかし、DB更新の処理を入れるとやはり処理が実行されず、postmasterへメールも届きませんでした。
cronの設定には問題がなさそうです。

www直下において直接アクセスするとやはり動くのですが、cronで実行したときのみ、DB処理を入れると動かないという状況です。

実行している処理は以下の通りです。

PHP

1<?php 2 // 関数や定数ファイルの読み込み 3 include_once($_SERVER['DOCUMENT_ROOT'] . '/test/common/include.php'); 4 5 // pdoを返却する関数を実行 6 $pdo = funcGetPdo(); 7 // トランザクションの開始 8 $pdo->beginTransaction(); 9 10 //--------------------------------------- 11 // 更新① 12 //--------------------------------------- 13 // ステートメント発行 14 $stmt = $pdo->prepare 15 (" 16 動作確認済みのSQL(INSERT) 17 "); 18 $stmt->execute(); 19 20 //--------------------------------------- 21 // 更新② 22 //--------------------------------------- 23 // ステートメント発行 24 $stmt = $pdo->prepare 25 (" 26 動作確認済みのSQL(UPDATE) 27 "); 28 $stmt->execute(); 29 30 // コミット 31 $pdo->commit(); 32 33 //--------------------------------------- 34 // メール送信 35 //--------------------------------------- 36 $stmt = $pdo->prepare 37 (" 38 送信ユーザーを抽出するSELECT文 39 "); 40 $stmt->execute(); 41 // 取得データを連想配列として格納 42 $aryList = $stmt->fetchAll(PDO::FETCH_CLASS); 43 44 foreach( $aryList as $row ) { 45 // ヘッダ 46 $header = ''; 47 // 差出人アドレス 48 $header = "From:test@XXXXX.sakura.ne.jp\n"; 49 // 返信先アドレス 50 $header .= "Reply-To:test@XXXXX.sakura.ne.jp\n"; 51 //------------------ 52 // ユーザーに届くメールをセット 53 //------------------ 54 // 件名 55 $subject = "件名"; 56 // 本文 57 $strMessage = <<< messagetext 58{$row->NAME}59XXXXXXXXXXXXXXXXXX 60XXXXXXXXXXXXXXXXXX 61XXXXXXXXXXXXXXXXXX 62messagetext; 63 //------------------ 64 // 送信 65 //------------------ 66 mb_send_mail($row->EMAIL , $subject, $strMessage , $header ); 67 } 68?>

繰り返しになりますが、
上記のコードは、/home/XXXXX/www/の直下に置いて、http://XXXXX.sakura.ne.jp/test.phpでアクセスすると動作します。
しかし、/home/XXXXX/に置いて、cronで実行すると動きません。
また、ソースコードをメール送信のみに変更するとcronは動作しました。

上記の処理(DB関連の処理?)に「cronで実行した時のみ発生する問題」があると思うのですが・・・。

よろしくお願いいたしますm(__)m

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/12/08 12:42

どういう設定にしてるのかわからんけどエラーでる設定を1時間放置してもメールは1回しかとんでないんじゃね?
miki0901

2018/12/09 00:43

1時間放置とはどういうことでしょうか?
退会済みユーザー

退会済みユーザー

2018/12/09 02:19

毎時5分と 5分毎の設定みすってるんじゃねと、あと管理画面からの設定はリアルタイムじゃないからな
miki0901

2018/12/09 03:46

ご回答ありがとうございます!参考になります。 実行方法については、実際は1日一回にしますが、今のテスト段階では、日時指定で現在時刻の5分後を指定して実行しております。また、追記を行いましたのでご教授いただけますと幸いですm(__)m
guest

回答3

0

ベストアンサー

コードが出てきたためにわかったが
エラーレポートがOFF(ディスプレイ)されてないため

include_once($_SERVER['DOCUMENT_ROOT'] . '/test/common/include.php');

で落ちてると思われます。
標準出力も標準エラーもされてないのでポストマスターにも届きません。

投稿2018/12/09 03:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

miki0901

2018/12/09 04:27

ありがとうございます! include_once($_SERVER['DOCUMENT_ROOT'] . '/test/common/include.php'); を消して、include.phpの中のソース(funcGetPdo()やSQL出力など)を直書きに変えたところ、無事動作しました! BAにさせて頂きますm(__)m (さいごに)wwwより上の階層では、$_SERVER['DOCUMENT_ROOT']が使用できないということなのでしょうか?
退会済みユーザー

退会済みユーザー

2018/12/09 04:53

apache の環境変数ですから apache を通さないと設定されてません。
miki0901

2018/12/09 13:10

ありがとうございます。 大変助かりましたm(__)m
guest

0

コマンドの後ろに以下のリダイレクトを付けてどんなエラーが出ているか確認して下さい。

bash

1command > /tmp/test.log 1>&2

投稿2018/12/08 14:52

hichon

総合スコア5737

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

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

miki0901

2018/12/09 00:43 編集

回答ありがとうございます。 cd /home/XXXXX; /usr/local/bin/php test.php /tmp/test.log 1>&2 上記でよろしいでしょうか? 「test.log」とtmpフォルダはあらかじめ作成しておくのでしょうか? さくらの場合、XXXXX以下にしかファイルを作成できないので、 「cd /home/XXXXX; /usr/local/bin/php test.php /home/作成フォルダ/test.log 1>&2」 のような感じでしょうか?
退会済みユーザー

退会済みユーザー

2018/12/09 03:59

ポストマスターへのメールからファイルに変えただけじゃ意味がないですよね
guest

0

さくらインターネットのスタンダードプランなら、ssh で接続できるようなので、

/usr/local/bin/php /home/XXXXX/test.php

を実行してみては?

投稿2018/12/09 02:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

miki0901

2018/12/09 03:47

ありがとうございます! 色々検証したところ、どうやらcronの設定はおかしくない?っぽいのです・・。 追記した点についてわかりましたらご教授いただけますと幸いですm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問