だ。ログ。

開発とかスノボとかやきうとか。

get_headersでHTTPステータスコードが正しく取れない

自分達だけ使っているシステムだとオペレーション上でなんとでもなる事かもしれないが、他人が使っている場合どうしても突拍子もない操作から想定していない自体が起こりうる。
画像が消えた!と言う事を言われる。そもそも既存であるシステムのため、レコード上に存在しているデータは性善説で「ある」と考える。
ただし、性悪説も考えないといけないのは仮にデータレコード上に残っているが実体ファイルが何らかの拍子に消えてしまった。
と言う事を想定すると、画像の存在チェックが必要になってくる。

やり方としては、ページを開いた際に画像チェックを行って無ければデフォルトの画像を入れる。
ただしこのやり方は1ページの情報量が少なければそんなに問題はないのだが、一覧ページでサムネイルが並んでいる場合が厄介な事になる。
画像分のリクエストをがページ内で発生してしまい、ページの速度低下が考えられる。

もう一つはバッチ処理等で1時間なのか半日なのか1日単位で画像の存在チェックを一気に行う方法。
今回はこちらをチョイスしてプログラムを組んだ。

for($i=1;$i<=100;$i++){
	$url = "https://hogefuga.com/images/{$i}.jpg";
	$http_header = get_headers($url);
}

これでヘッダレスポンスコードが200以外は無い。とみなすとしようとしたが

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in
Warning: get_headers(): Failed to enable crypto in 

と言うWarningが出てしまっている事と、ヘッダレスポンスが取れない。

どうやら有効な中間キーなしでのSSL証明書がインストールされているサーバーの場合、このような問題が起こりうるらしい。
と言う事でこれを回避する。

stream_context_set_default( [
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
    ],
]);
for($i=1;$i<=100;$i++){
	$url = "https://hogefuga.com/images/{$i}.jpg";
	$http_header = get_headers($url);
	if($http_header['0'] != "HTTP/1.1 200 OK"){
		echo "ファイルが存在しません{$i}";
	}
}

と言う事で回避。
HTTPが1.0だったりするので、個別に一旦ソースコードを実行する際に$http_header['0']は確認、目視しておかないと判定部分でコケる事になるので注意