現在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を使っていることが原因かもと思ったりしているのですが、根本的な解決に至っておりません。
解決方法など、わかる方おられましたら、ご教授いただけると幸いです。
よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/29 06:36