

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

# 問題

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

# 開発環境

  * macOS
  * MAMP 5.5
  * PHP Version 7.3.8
  * MySQL 5.7.26

[code]

    htdocs/
    └──cron_test/
        └──index.php // cronから実行するファイル
    
[/code]

  

# これまでの経過

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

**crontab**

[code]

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

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

**index.php**

[code]

    <?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");
    
[/code]

  
**結果**

[code]

    2020-05-29 11:35:00
    2020-05-29 11:36:00
    2020-05-29 11:37:00
    2020-05-29 11:38:00
    
[/code]

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

ソースコードは下記です。  
  
**index.php**

[code]

    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");
      }
    
[/code]

**cron.log**

[code]

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

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

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

## 確認したこと

  * mysqlソケットの確認  
[CakePHPでMySQLに接続しようとしたら「SQLSTATE[HY000] [2002] No such file or directory」と出た
- Qiita](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`のエラーがなくなりましたが、また違うメッセージが表示されました。

[code]

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

[PHPでMYSQLに接続しようとしましたがエラーが出ました -
Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11174448256)

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

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

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


CC BY-SA 4.0
2020-05-29T05:15:57.733
67116
2023-02-24T04:09:06.173
2020-12-06T07:21:07.790
3060
40382
question
php cron
crontabでPHPを実行したいが、mysqlに接続できない


PHP のパスを `/Applications/MAMP/bin/php/php7.x.x/bin/php` に書き換えたら実行されました。

* * *

_この投稿は[@keisuke1223
さんのコメント](https://ja.stackoverflow.com/questions/67116/crontab%e3%81%a7php%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%97%e3%81%9f%e3%81%84%e3%81%8c-mysql%e3%81%ab%e6%8e%a5%e7%b6%9a%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84#comment73654_67116)
の内容を元に コミュニティwiki として投稿しました。_


CC BY-SA 4.0
2020-12-06T05:14:56.447
72447
2020-12-06T05:14:56.447
3060
67116
answer