【Laravel】「Undefined constant “CURL_SSLVERSION_TLSv1_2″」エラーがXserver本番環境だけで出た時の対処法

2026.01.09

はじめに

Laravelで外部API(AsanaやSlackなど)と連携する機能を開発し、ローカル環境(Dockerなど)では完璧に動作していました。

しかし、いざXserverの本番環境にデプロイして動かしてみると、なぜかAPI通信の部分でエラーが発生…。

ログを確認すると Undefined constant “CURL_SSLVERSION_TLSv1_2” という謎のエラーが出ていました。

今回はその原因と、たった3行で解決できる対処法をシェアします。

対象となる環境・バージョン

この現象は、以下の環境で発生することが確認されています。

  • Laravel: 6.x / 7.x / 8.x / 9.x / 10.x / 11.x
    • ※Laravelが依存している「Guzzle」というライブラリを使用している環境全般
  • PHP: 7.4 / 8.0 / 8.1 / 8.2 / 8.3
  • サーバー: Xserver などの共用レンタルサーバー
    • 特に、長期間契約していて古いサーバー環境(SV番号が古いなど)のままPHPのバージョンだけ上げた場合に発生しやすいです。

重要: 「PHPのバージョンを最新(8.x)にしているから大丈夫」ではありません。PHPのバージョンに関わらず、サーバーOS側のライブラリ(libcurl)が古いと発生します。

発生したエラー

storage/logs/laravel.log を確認すると、Guzzle(LaravelのHTTPクライアント)がクラッシュしていました。

Plaintext

[202X-XX-XX XX:XX:XX] production.ERROR: Undefined constant "CURL_SSLVERSION_TLSv1_2" 
{"exception":"[object] (Error(code: 0): Undefined constant \"CURL_SSLVERSION_TLSv1_2\" at 
.../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:104)

原因

サーバーに入っている cURL ライブラリ(libcurl)のバージョンが古かったこと が原因です。

Laravel(Guzzle)はセキュリティ強化のため、通信時に「TLS 1.2」を明示的に指定しようとします。その際に CURL_SSLVERSION_TLSv1_2 という定数を使用するのですが、Xserverの一部の環境(特に古くから使っているサーバー番号など)では、この定数が定義されていないことがあるようです。

解決策

サーバーのOSやライブラリをユーザー側でアップデートするのは難しいため、Laravel側で「定数がないなら定義してあげる」という処理(Polyfill)を追加します。

app/Providers/AppServiceProvider.phpboot メソッドに以下のコードを追記します。

修正ファイル: app/Providers/AppServiceProvider.php

PHP

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        // ★ここを追加:本番環境で cURL の定数が未定義の場合のエラー回避策
        if (!defined('CURL_SSLVERSION_TLSv1_2')) {
            // 定数が定義されていなければ、整数の「6」として定義する
            define('CURL_SSLVERSION_TLSv1_2', 6);
        }
    }
}

解説

CURL_SSLVERSION_TLSv1_2 という定数は、実体としては整数の 6 です。

PHP側で「もしこの定数が定義されていなかったら、6として定義するよ」とプログラム側で教えてあげることで、Guzzleはエラーを吐かずにそのまま処理を進めてくれます。

実際に裏側の通信ライブラリがTLS 1.2に対応していれば(今のサーバーならほぼ対応しています)、これで問題なく通信が通ります。

まとめ

  • ローカルは動くのにXserver本番だけでGuzzleが落ちる時は CURL_SSLVERSION_TLSv1_2 を疑う。
  • PHPのバージョンが新しくても、サーバーOSが古いと発生する。
  • AppServiceProvider で強制的に define してあげれば解決する。

Xserverなどの共有レンタルサーバーでLaravelを運用している方の参考になれば幸いです!


🏢 株式会社ハジメクリエイトについて

この記事は、 株式会社ハジメクリエイト のエンジニアが執筆しました。


💻 Webシステム開発のプロフェッショナル

私たちは、ビジネスの成長をサポートするため、 PHPを用いたオーダーメイドのシステム開発 を提供しています。
お客様一人ひとりのニーズに応じたカスタムシステムを、 企画から開発・運用まで一貫してサポート
さらに、 React Nativeを活用したiOS/Android対応のアプリ開発 も得意としています。

単に「作る」だけでなく、
課題の本質に向き合い、最適な解決策を提案する のがハジメクリエイトのスタイルです。


🧑‍💻 一緒に働く仲間を探しています!

株式会社ハジメクリエイトでは、 自ら考え行動できるエンジニア を募集しています。
「私はこれがしたい!」という想いを持つあなた、一緒にモノづくりを楽しみませんか?

  • 技術で人の役に立ちたい
  • 意見が通る小さなチームで働きたい
  • フロントエンドもバックエンドも、いろいろ挑戦してみたい
  • お客さんと一緒にプロジェクトを育てたい

そんな気持ちがある方なら、きっと居心地のいい環境だと思います。
正社員はもちろん、パートタイムでの参加も歓迎中! 柔軟な関わり方で、あなたらしく働いてください。

👉 採用情報を見る
👉 お問い合わせはこちら


ちょっとでも「この会社、気になるな」と思ったら、ぜひお気軽にご連絡ください📩
最後まで読んでいただきありがとうございました!

  • Web技術

この記事を書いた人

Sho Tsukamoto

Chief Engineer Sho Tsukamoto

2023年4月入社。Web職人のたまごです。 最近はもっぱらコーディングすることは少なく、LaravelやReact Nativeを用いたシステム開発をメインとしています。

Sho Tsukamotoの書いた記事一覧へ

ハジメクリエイトでは一緒に働く仲間を募集しています!

関連記事