XServerのcronにてLaravelのScheduleがrunしないときに確認するべきこと。

2025-01-30

事象

XServer 上で php artisan schedule:run を Cron に登録して実行したところ、以下のようなエラーが発生し、スケジューラーが正常に動作しない現象が発生しました。

エラー内容

production.ERROR: Undefined constant "CURL_SSLVERSION_TLSv1_2"
{"exception":"[object] (Error(code: 0): Undefined constant \"CURL_SSLVERSION_TLSv1_2\" at ..."}

CURL_SSLVERSION_TLSv1_2 定数が未定義のため、Laravel 内部の HTTP 処理で失敗していることがわかります。

原因

このエラーの主な原因は cURL のバージョンが古いこと にあります。

  • CURL_SSLVERSION_TLSv1_2 は PHP 5.5.19 以降で定義されます。
  • また、cURL ライブラリが 7.34.0 未満 の場合もこの定数が未定義となります。

CLI バージョンの違いに注意

XServer ではドメインごとに PHP バージョンは変更できますが、CLI(コマンドライン)で使用される PHP バージョンは別 です。
CLI 側で古いバージョンが使われている場合、定数が定義されておらずエラーになります。

CLI PHP バージョンの切り替え手順はこちらを参考にしてください:

PHP CLIバージョンの変更手順

エラーの直接的な原因

Laravel スケジュール内で Http::get() を使用していたことがトリガーでした。
Laravel では内部的に Guzzle HTTP クライアントが使われており、Laravel 7 以降では TLS1.2 を前提 に動作しています。

そのため、古い cURL 環境では TLS1.2 に対応できず、未定義の定数 CURL_SSLVERSION_TLSv1_2 を参照しエラーとなっていました。

現代の多くの API は TLS1.2 以上を前提としており、暫定的な対処よりも根本対応が推奨されます。

解決方法:XServer の新サーバー環境へ移行

今回の環境は、XServer の 旧サーバー環境(例:sv1 ~ sv16000.xserver.jp) だったため、cURL のバージョンが古く TLS1.2 に対応していませんでした。

対応策

  • XServer の新サーバーへ移行(サーバー基盤が最新化され、cURL も新しくなります)
  • これにより CURL_SSLVERSION_TLSv1_2 が定義されるようになり、Laravel の HTTP クライアントも正常動作

    XServer 新サーバー移行の案内

実際の移行体験記はこちらにまとめています:

XServer サーバー移行体験記(hasethblog)

結論

  • Laravel + Guzzle 環境で CURL_SSLVERSION_TLSv1_2 エラーが出る場合、cURL や PHP CLI のバージョン確認が最優先
  • XServer の場合は、新サーバーへの移行で根本的に解決可能
  • セキュリティ的にも TLS1.2 以上が必須な今、対応を後回しにするのは避けましょう

以上