PHP: Caddy で php-fpm を利用する

Caddy は HTTP/2 に対応した Web サーバーで php-fpm (FastCGI) も利用できる。

go get コマンドでインストールする。

go get github.com/mholt/caddy/caddy

homebrew でもインストールできる。

brew install caddy

Caddyfile を用意する。

localhost:2020
tls self_signed
fastcgi / 127.0.0.1:9000 php

Caddyfile の存在するディレクトリでウェブサーバーを起動させてみよう。

caddy

PHP: 文字列の先頭が指定した文字列で始まるもしくは文字列の末尾が指定した文字列で終わることをチェックする

PHP Internals で str_begin、str_end の提案があったので、mbstring を使って定義してみた。提案のなかではシングルバイトしか考慮されていないが、マルチバイト対応であれば支持をする人が増えるのではないかと思った。

function mb_begin(string $haystack, string $needle, string $enc = null)
{
    if ($enc === null) {
        $enc = mb_internal_encoding();
    }

    $len = mb_strlen($needle, $enc);
    return mb_substr($haystack, 0, $len, $enc) === $needle;
}


function mb_end(string $haystack, string $needle, string $enc = null)
{
    if ($enc === null) {
        $enc = mb_internal_encoding();
    }

    $len = mb_strlen($needle, $enc);
    return mb_substr($haystack, $len, null, $enc) === $needle;
}


var_dump(
    true === mb_begin('あいうえおかきくけこ', 'あいうえお'),
    false === mb_begin('あいうえおかきくけこ', 'かきくけこ'),
    true === mb_end('あいうえおかきくけこ', 'かきくけこ'),
    false === mb_end('あいうえおかきくけこ', 'あいうえお')
);

PHP: コードポイントを別の文字集合のコードポイントに変換する

文字を文字に変換する mb_convert_encoding の代わりにコードポイントをコードポイントに変換する mb_convert_encoding という 名前の関数を定義してみた。

function mb_convert_codepoint($codepoint, $to, $from = null)
{
    if ($from === null) {
        $from = mb_internal_encoding();
    }

    $char = mb_chr($codepoint, $from);
    $char = mb_convert_encoding($char, $to, $from);
    return mb_ord($char, $to);
}


var_dump(
    0x82a0 === mb_convert_codepoint(0x3042, 'Shift_JIS', 'UTF-8')
);

PHP: mb_at を定義する

しばらく PHP から離れていたので、リハビリ。

function mb_at($str, $i, $enc = null)
{
    if (!$enc) {
        $enc = mb_internal_encoding();
    }

    return mb_substr($str, $i, 1, $enc);
}

function str_gen($str, $enc = null)
{
    if (!$enc) {
        $enc = mb_internal_encoding();
    }

    $char = '';
    $i = 0;

    while ($char = mb_at($str, $i, $enc)) {
        ++$i;
        yield $char;
    }
}

$str = 'あいうえお';

foreach (str_gen($str) as $char) {
    echo $char, PHP_EOL;
}

IteratorAggregate を実装してイテレーターをつくってみよう。

class StringIterator implements IteratorAggregate {
    private $value = '';
    private $enc = null;

    public function __construct(string $value, $enc = null) {
        $this->value = $value;
        $this->enc = $enc ? $enc : mb_internal_encoding();
    }

    public function getIterator() {
        $i = 0;

        while ($char = mb_at($this->value, $i, $this->enc)) {
            yield $char;
            ++$i;
        }
    }
}

function mb_at($str, $i, $enc = null)
{
    if (!$enc) {
        $enc = mb_internal_encoding();
    }

    return mb_substr($str, $i, 1, $enc);
}


$it = new StringIterator('あいうえお');

foreach ($it as $char) {
    echo $char, PHP_EOL;
}
ArchiveRandomHomeNext pagePage 1 of 152