過去リリースされているPHPの全バージョン一覧を取得

http://php.net には、リリースされているPHPのバージョン一覧が載っている。

http://jp2.php.net/releases/

実はjsonやphp serialize形式でもこの結果を取得できるので、これを利用して、PHPのバージョン一覧を取得するスクリプトを書いた。

```php:php-versions.php
<?php

function main($argc, array $argv)
{
    $host = getenv('PHP_NET_HOST');
    if (!$host) {
        $host = 'http://jp2.php.net';
    }

    $phpall = download($host . '/releases/index.php?serialize');
    $phpall = unserialize($phpall);
    foreach ($phpall as $major => $info) {
        $phpver = download("$host/releases/index.php?serialize&version=$major&max=1000");
        $phpver = unserialize($phpver);
        $phpver = array_keys($phpver);

        say("\n## $major");
        usort($phpver, 'version_compare');

        $miner = 0;
        $i = 0;
        $basever = "$major.$miner";
        say("### $basever");
        foreach ($phpver as $ver) {
            if (0 !== strncmp($ver, $basever, strlen($basever))) {
                ++$miner;
                $basever = "$major.$miner";
                say("\n\n### $basever");
                $i = 0;
            }
            echo "$ver\t";
            if (++$i > 9) {
                echo PHP_EOL;
                $i = 0;
            }
        }

        echo PHP_EOL;
    }

    return 0;
}

function say($str)
{
    echo $str, PHP_EOL;
}

interface CurlException
{
}

class ConnectException extends RuntimeException implements CurlException
{
}

class HttpException extends RuntimeException implements CurlException
{
}

function download($url) {
    static $ch;
    if (!$ch) $ch = curl_init();

    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_ENCODING => '',
    ]);

    $response = curl_exec($ch);

    $errno = curl_errno($ch);
    if ($errno !== CURLE_OK) {
        throw new ConnectException(curl_error($ch), $errno);
    }

    $info = curl_getinfo($ch);
    if ($info['http_code'] >= 400) {
        throw new HttpException($info['http_code'], $response);
    }

    return $response;
}

die(main($argc, $argv));
```

```
php php-versions.php
```

### 実行結果例

こうやって見ると、PHP5.4/5.5時代が結構長かったんだなーと思う。

```
## 7
### 7.0
7.0.0	7.0.1	7.0.2	7.0.3	7.0.4	7.0.5	7.0.6	7.0.7	7.0.8	7.0.9	
7.0.10	7.0.11	7.0.12	7.0.13	

## 5
### 5.0
5.0.0	5.0.1	5.0.2	5.0.3	5.0.4	5.0.5	

### 5.1
5.1.0	5.1.1	5.1.2	5.1.3	5.1.4	5.1.5	5.1.6	

### 5.2
5.2.0	5.2.1	5.2.2	5.2.3	5.2.4	5.2.5	5.2.6	5.2.8	5.2.9	5.2.10	
5.2.11	5.2.12	5.2.13	5.2.14	5.2.15	5.2.16	5.2.17	

### 5.3
5.3.0	5.3.1	5.3.2	5.3.3	5.3.4	5.3.5	5.3.6	5.3.7	5.3.8	5.3.9	
5.3.10	5.3.11	5.3.12	5.3.13	5.3.14	5.3.15	5.3.16	5.3.17	5.3.18	5.3.19	
5.3.20	5.3.21	5.3.22	5.3.23	5.3.24	5.3.25	5.3.26	5.3.27	5.3.28	5.3.29	


### 5.4
5.4.0	5.4.1	5.4.2	5.4.3	5.4.4	5.4.5	5.4.6	5.4.7	5.4.8	5.4.9	
5.4.10	5.4.11	5.4.12	5.4.13	5.4.14	5.4.15	5.4.16	5.4.17	5.4.18	5.4.19	
5.4.20	5.4.21	5.4.22	5.4.23	5.4.24	5.4.25	5.4.26	5.4.27	5.4.28	5.4.29	
5.4.30	5.4.31	5.4.32	5.4.33	5.4.34	5.4.35	5.4.36	5.4.37	5.4.38	5.4.39	
5.4.40	5.4.41	5.4.42	5.4.43	5.4.44	5.4.45	

### 5.5
5.5.0	5.5.1	5.5.2	5.5.3	5.5.4	5.5.5	5.5.6	5.5.7	5.5.8	5.5.9	
5.5.10	5.5.11	5.5.12	5.5.13	5.5.14	5.5.15	5.5.16	5.5.17	5.5.18	5.5.19	
5.5.20	5.5.21	5.5.22	5.5.23	5.5.24	5.5.25	5.5.26	5.5.27	5.5.28	5.5.29	
5.5.30	5.5.31	5.5.32	5.5.33	5.5.34	5.5.35	5.5.36	5.5.37	5.5.38	

### 5.6
5.6.0	5.6.1	5.6.2	5.6.3	5.6.4	5.6.5	5.6.6	5.6.7	5.6.8	5.6.9	
5.6.10	5.6.11	5.6.12	5.6.13	5.6.14	5.6.15	5.6.16	5.6.17	5.6.18	5.6.19	
5.6.20	5.6.21	5.6.22	5.6.23	5.6.24	5.6.25	5.6.26	5.6.27	5.6.28	

## 4
### 4.0
4.0.0	4.0.1	4.0.2	4.0.3	4.0.4	4.0.5	4.0.6	

### 4.1
4.1.0	4.1.1	4.1.2	

### 4.2
4.2.0	4.2.1	4.2.2	4.2.3	

### 4.3
4.3.0	4.3.1	4.3.2	4.3.3	4.3.4	4.3.5	4.3.6	4.3.7	4.3.8	4.3.9	
4.3.10	4.3.11	

### 4.4
4.4.0	4.4.1	4.4.2	4.4.3	4.4.4	4.4.5	4.4.6	4.4.7	4.4.8	4.4.9	


## 3
### 3.0
3.0.x (latest)	
```