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

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

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

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

PHP

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

Q&A

解決済

3回答

2266閲覧

crontabでPHPを実行したいが、mysqlに接続できない

keisuke1223

総合スコア1

cron

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

PHP

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

0グッド

0クリップ

投稿2020/05/29 05:17

現在cronについて勉強しており、自己解決が難しく感じたため質問させてください。

問題 

テストでMysqlからデータを取得し、テキストログに書き出そうとしたところ、SQLSTATE[HY000] [2002] No such file or directoryというエラーが出てうまくいかない状況です。

開発環境

  • macOS
  • MAMP 5.5
  • PHP Version 7.3.8
  • MySQL 5.7.26
htdocs/ └──cron_test/ └──index.php // cronから実行するファイル

 

これまでの経過

まず、いきなりデータベースを操作せずに、現在の日付をログ出力するようにしました。

crontab

* * * * * /usr/bin/php /Applications/MAMP/htdocs/cron_test/index.php > /Applications/MAMP/htdocs/cron_test/cron.log 2>&1

which phpをして返ってきたPHPのパスを記述してます。
実行するphpファイルは、htdocs内のcron_testディレクトリの中です。

index.php

<?php date_default_timezone_set('Asia/Tokyo'); $date = new DateTime(); $datetime = $date->format('Y-m-d H:i:s'); error_log("$datetime\n", 3, dirname(__FILE__) . "/debug.log");

 
結果

2020-05-29 11:35:00
2020-05-29 11:36:00
2020-05-29 11:37:00
2020-05-29 11:38:00


結果は、1分ごとにPHPが実行されているのが確認できました。
続いて、crontabの設定はそのままで、Mysqlからテストデータを取得し、ログファイルの定期出力を試みました。

 

 
ソースコードは下記です。

index.php

date_default_timezone_set('Asia/Tokyo'); $date = new DateTime(); $datetime = $date->format('Y-m-d H:i:s'); try { $pdo = new PDO( 'mysql:dbname=testdb;host=localhost;charset=utf8mb4', 'root', 'root', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); $stmt = $pdo->query('SELECT * FROM users'); $rows = $stmt->fetchAll(); } catch (PDOException $e) { header('Content-Type: text/plain; charset=UTF-8', true, 500); exit($e->getMessage()); } foreach($rows as $val) { $user_id = $val['user_id']; $send_id = $val['send_id']; $name = $val['name']; $email = $val['email']; $comment = $val['comment']; $status = $val['status']; $created_at = $val['created_at'].'...'; error_log("$user_id.$send_id.$name.$email.$comment.$status.$created_at.$datetime.\n", 3, dirname(__FILE__) . "/debug.log"); }

 

cron.log

SQLSTATE[HY000] [2002] No such file or directory

 
cronのログファイルに上記エラーが出力され正常に読み込めない状態となりました。

なお、cronを使用せず、PHPファイルを実行(ブラウザリロード)すると、正常に動作します。

 

確認したこと

  • mysqlソケットの確認

https://qiita.com/Yorinton/items/bfdf962fe4b7339866f6

こちらの記事をみて、php.iniの設定も確認してみたのですが、

接続先が/Applications/MAMP/tmp/mysql/mysql.sockとなっており、MAMPのmysqlソケットが設定されていました。

  • hostを127.0.0.1に変更

localhostを指定していたので、試しに127.0.0.1に変更してみました。

すると、No such file or directoryのエラーがなくなりましたが、また違うメッセージが表示されました。

SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)

 
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11174448256

この記事を見たのですが、MAMPのrootユーザーの設定は操作していないですし、
cronを使わずにPHPを実行すると接続できているので、何故なのかわかりませんでした。。

  • cronでPHPファイルの実行はできているが、mysqlにアクセスしようとするとエラーになる
  • localhostであればディレクトリーがないと怒られる
  • 127.0.0.1であれば、rootでアクセスできないと怒られる

 

MAMPを使っていることが原因かもと思ったりしているのですが、根本的な解決に至っておりません。
解決方法など、わかる方おられましたら、ご教授いただけると幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

おす!

色々複雑になってっから、おめぇの環境をみねぇと一番楽な方法は教えられねぇんだけんどもよぅ、

127.0.0.1であれば、rootでアクセスできないと怒られる

これを解決する方法が一番楽だろうなぁ。

MySQLはlocalhostとIP127.0.0.1の接続は別物として扱われてっから、

root@localhost と root@127.0.0.1 は別のアカウントになるんだ。
(前者はUNIXソケット接続のユーザ、後者はTCP/IP接続のユーザ)

だから、MySQLに新しく root@127.0.0.1 のアカウントを作れば良い。

create user root@127.0.0.1 identified by 'root';

それが一番手っ取り早い解決になんだろ。

投稿2020/05/29 05:55

編集2020/05/29 05:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

keisuke1223

2020/05/29 06:36

> root@localhost と root@127.0.0.1 は別のアカウントになるんだ。 そうなのですね!同じだと思ってました! こちらも時間があれば試して見たいと思います。 ありがとうございます。
guest

0

ベストアンサー

macOS
MAMP 5.5
PHP Version 7.3.8

が動作環境ということですが、

/usr/bin/php

は、macOS に標準で入っている PHP でしょうか?

MAMP の PHP は、 /Applications/MAMP/bin/php/Applications/MAMP/bin/php/php7.x.x/bin/php (MAMP のバージョンによっては、PHP が複数バージョンから選べるため)

おそらく、ブラウザ経由では動作して、cron からは、動作しないのは、MAMP の PHP と macOS 標準の PHP で PHP の設定(php.iniの内容)が 異なるためと思います。

Web ブラウザ経由の実行では、動作しているということなので、MAMP の PHP コマンドであれば動作すると思われますので...

まずは、MAMP の PHP のパスを調べます。
MAMP のバージョンによって変わると思いますが、おそらく、

/Applications/MAMP/bin/php
/Applications/MAMP/bin/php/php7.x.x/bin/php

のどちらかにあると思います。( 7.x.x の部分は、MAMP の PHP のバージョンです。)

次に ターミナル上で、調べた MAMP の PHP コマンドをフルパスで指定して

/Applications/MAMP/bin/php/php7.3.8/bin/php /Applications/MAMP/htdocs/cron_test/index.php

のように実行してみると どうなるでしょうか?

投稿2020/05/29 06:23

CHERRY

総合スコア25171

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

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

keisuke1223

2020/05/29 06:35

>おそらく、ブラウザ経由では動作して、cron からは、動作しないのは、MAMP の PHP と macOS 標準の PHP で PHP の設定(php.iniの内容)が 異なるためと思います。 おっしゃる通りでした! MAMPのPHPパスに書き換えると、実行されました。 ありがとうございます!
guest

0

phpはwebベースとCLIでは動作環境がことなります。
やるならwebベースで公開しているphpファイルをhttp経由で
wgetやcurlなどでクロールすることです

投稿2020/05/29 05:28

yambejp

総合スコア114839

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

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

keisuke1223

2020/05/29 06:37

> やるならwebベースで公開しているphpファイルをhttp経由で wgetやcurlなどでクロールすることです ありがとうございます! ちょっとまだ理解が及びませんが、こちらも調べて見ます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問