20190524のPHPに関する記事は9件です。

PHPで縦書きPDF作成(TCPDF) カッコなどの文字回転対応

概要

PHPで縦書きのPDFを作成するときに実現した方法のメモです。
※執筆時点でまだ未完全です。

縦書き対応方針

いくつかネット上の記事がありますが、こちらの記事の内容をベースとさせていただきました。
PDFで日本語縦書きしたい

この記事の方法と特徴としては以下です。
- TCPDF自体のソースやフォント設定の書き換えは行わない
- 1文字ずつばらして縦に配置していくという力業で縦書きを実現する

最終的にこちらを採用したのは、かなり手間かかりますが、文字単位で細かく調整ができるからです。

その他検討した方法

TCPDFマニュアル(勝手訳) 縦書き対応
フォント埋め込みでなくなるというのが、見栄え的に厳しかった。

TCPDFで縦書きテキストをフォント埋め込みに対応させる
こちらの方法は、フォント埋め込みができる。ソースを書き換えるが、たった1か所だけで対応。最初これを採用しようと思っていたが…後述する文字の回転ができずに諦めることに。

実装

実際かいたコードなどです。

環境情報

  • PHP 7.2.14
  • FDPI 2.2 ※今回のコードではたぶん不要。いちおう入れた環境で試したので明記。
  • TCPDF 6.2
  • 使用フォント:IPAex明朝 Ver.002.01

準備

Composerにて、FPDIとTCPDFをインストール

コード

参考サイトのコードをベースに、主として以下を変更しています。
- 「 」など特定の文字回転を回転するコードを追加
- 拗音に使われる小さい字「っ」などの位置調整を追加
- 文字ごとの調整係数は、表示させながら微調整した値なので・・・これといった算出根拠はないです。

<?php
require_once "lib/composer/vendor/autoload.php";

// create new PDF document
// A4 : 210×297mm
$pdf = new TCPDF('L', 'mm', 'A4', true, 'UTF-8', false);
$paper_h = 210;
$paper_w = 297;
$pageMargin = 15;

// remove default header/footer
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);

// ---------------------------------------------------------

// IPAフォント埋め込み
$font = new TCPDF_FONTS();   
$fontfile = 'fonts/ipaexm.ttf';
$myFont = $font->addTTFfont($fontfile);

// ページ追加
$pdf->AddPage();

//線のスタイル
$lineStyle = array(
    'width'=>0.1
);

$xPosi = $paper_w-$pageMargin;
$pdf->Line( $xPosi, $pageMargin, $xPosi, $paper_h-$pageMargin, $lineStyle);
$xPosi -= pt2mm(12)+3;
tateText($xPosi, $pageMargin, '令和元年 第一回「Aクラス」漢字テスト', 12);
$xPosi -= pt2mm(12)+2;
tateText($xPosi, $pageMargin+100, '年   組   番', 12);
$xPosi -= pt2mm(12)+2;
tateText($xPosi, $pageMargin+85, '名前', 12);
$xPosi -= 2;
$pdf->Line( $xPosi, $pageMargin, $xPosi, $paper_h-$pageMargin, $lineStyle);
$xPosi -= pt2mm(12)+10;
tateText($xPosi, $pageMargin, '〔一〕次の《 》を漢字に直しなさい。', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '①標識の案内に《シタガッ》て歩く。', 12);
tateText($xPosi, $pageMargin+110, '〔①', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '②欠員を《オギナウ》。', 12);
tateText($xPosi, $pageMargin+110, '〔②', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '③国民の義務として、税金を《オサメル》。', 12);
tateText($xPosi, $pageMargin+110, '〔③', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);

$xPosi -= pt2mm(12)+10;
tateText($xPosi, $pageMargin, '〔二〕次の《 》の読みを書きなさい。', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '①電車を《降》りて職場に向かった。', 12);
tateText($xPosi, $pageMargin+110, '〔①', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '②叔父から卒業祝いが《届》いた。', 12);
tateText($xPosi, $pageMargin+110, '〔②', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '③あらかじめ《危》ない場所を確認する。', 12);
tateText($xPosi, $pageMargin+110, '〔③', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);

$xPosi -= pt2mm(12)+10;
tateText($xPosi, $pageMargin, '〔三〕次の意味になるように《 》部を漢字に直しなさい。', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '①広く大きな見通しをもっていること。《タッカン》', 12);
$xPosi -= pt2mm(12)+2;
tateText($xPosi, $pageMargin+110, '〔①', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '②説得力をもって力強く話すこと。《ユウベン》', 12);
$xPosi -= pt2mm(12)+2;
tateText($xPosi, $pageMargin+110, '〔②', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);
$xPosi -= pt2mm(12)+5;
tateText($xPosi, $pageMargin, '③他人の心をおしはかって相手に配慮すること。《ソンタク》', 12);
$xPosi -= pt2mm(12)+2;
tateText($xPosi, $pageMargin+110, '〔③', 12);
tateText($xPosi, $paper_h - $pageMargin - pt2mm(12) - 8, '〕', 12);

// ---------------------------------------------------------

//Close and output PDF document
//$pdf->Output('tate01.pdf', 'F');
$pdf->Output();

//============================================================+
// END OF FILE
//============================================================+

function tateText($x, $y, $str, $size) {
    global $pdf, $myFont;
    //フォントサイズ設定
    $pdf->SetFont($myFont, '', $size);
    //字間
    $fh = pt2mm($size*1.1);
    //文字数
    $l = mb_strlen($str, 'UTF-8');
    for ($i=0; $i<$l; $i++) {
        $s1 = mb_substr($str, $i, 1, 'UTF-8');
        $adj_x = 0; $adj_y = 0;
        // 文字ごとの位置や回転調整
        switch($s1){
            case '「':
                $adj_rotate_x = pt2mm($size);
                $adj_rotate_y = pt2mm($size*0.5);
                $adj_rotate_posi_x = pt2mm($size*0.4);
                $adj_rotate_posi_y = 0;
                $pdf->Rotate(270,$x+$adj_x+$adj_rotate_x,$y+$fh*$i+$adj_y+$adj_rotate_y);
                $pdf->Text($x+$adj_x+$adj_rotate_posi_x, $y+$fh*$i+$adj_y+$adj_rotate_posi_y, $s1,0);
                $pdf->Rotate(90,$x+$adj_x+$adj_rotate_x,$y+$fh*$i+$adj_y+$adj_rotate_y);
            break;
            case '」':
                $adj_rotate_x = pt2mm($size);
                $adj_rotate_y = pt2mm($size*0.5);
                $adj_rotate_posi_x = pt2mm($size*0.4);
                $adj_rotate_posi_y = pt2mm($size*0.3);
                $pdf->Rotate(270,$x+$adj_x+$adj_rotate_x,$y+$fh*$i+$adj_y+$adj_rotate_y);
                $pdf->Text($x+$adj_x+$adj_rotate_posi_x, $y+$fh*$i+$adj_y+$adj_rotate_posi_y, $s1,0);
                $pdf->Rotate(90,$x+$adj_x+$adj_rotate_x,$y+$fh*$i+$adj_y+$adj_rotate_y);
            break;
            case '《':
            case '》':
            case '~':
            case '〔':
            case '〕':
                //$adj_rotate_x = pt2mm($size);
                //$adj_rotate_y = pt2mm($size*0.3);
                //$adj_rotate_posi_x = pt2mm($size*0.7);
                $adj_rotate_x = pt2mm($size);
                $adj_rotate_y = pt2mm($size*0.5);
                $adj_rotate_posi_x = pt2mm($size*0.4);
                if($size<=12){
                    $adj_rotate_posi_y = pt2mm($size*0.15);
                }else{
                    $adj_rotate_posi_y = pt2mm($size*0.2);
                }
                $pdf->Rotate(270,$x+$adj_x+$adj_rotate_x,$y+$fh*$i+$adj_y+$adj_rotate_y);
                $pdf->Text($x+$adj_x+$adj_rotate_posi_x, $y+$fh*$i+$adj_y+$adj_rotate_posi_y, $s1,0);
                $pdf->Rotate(90,$x+$adj_x+$adj_rotate_x,$y+$fh*$i+$adj_y+$adj_rotate_y);
            break;
            case '。':
            case '、':
                $adj_x = $fh * 0.7; $adj_y = -$fh * 0.7;
                $pdf->Text($x+$adj_x, $y+$fh*$i+$adj_y, $s1,0);
            break;
            case 'っ':
            case 'ッ':
                $adj_x = pt2mm($size*0.1);
                $adj_y = -1*pt2mm($size*0.1);
                $pdf->Text($x+$adj_x, $y+$fh*$i+$adj_y, $s1,0);
            break;
            default:
                $pdf->Text($x+$adj_x, $y+$fh*$i+$adj_y, $s1,0);
            break;
        }
    }
}

// 1 インチ = 25.4 ミリメートル
// 1 ポイント = 1/72 インチ
// 1mm は、 25.4分の1インチ
function mm2pt($mm) {
    $pt = $mm / 25.4 * 72;
    return $pt;
}
function pt2mm($pt) {
    $mm = $pt / 72  * 25.4;
    return $mm;
}

出来上がりPDFイメージ

qiita_sample_02.png

今後の追加予定

  • 特殊処理をする文字を追加する
  • 文字サイズによる位置調整の細分化
  • テキストの折り返しと改ページの処理
  • その他もろもろ処理の汎用化

役に立ったサイト

  • TCPDF 公式サイトです。サンプルが豊富にあります。
  • TCPDFマニュアル(勝手訳) 縦書きの方法は使いませんでしたが、リファレンスとして一番活用させていただきました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker で Laravel開発環境

Nginxのconfを作成する

server {
    listen  80;
    root /usr/share/nginx/laravel/public;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ ^/.+\.php(/|$) {
        fastcgi_pass laravel-container:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

DockerでPHP-FPMを作成する

FROM php:7.3-fpm-alpine
RUN apk add libzip-dev
RUN docker-php-ext-configure zip --with-libzip
RUN docker-php-ext-install pdo_mysql zip

docker-composeを作成する

version: "3.7"

services:

  laravel:
    build: .
    container_name: laravel-container
    working_dir: /usr/share/nginx/laravel
    networks:
      - laravel-docker
    volumes:
        - ./laravel:/usr/share/nginx/laravel

  nginx:
    image: nginx:1.16-alpine
    container_name: reverse-proxy
    working_dir: /usr/share/nginx/laravel
    networks:
      - laravel-docker
    ports:
        - "8080:80"
    volumes:
        - ./default.conf:/etc/nginx/conf.d/default.conf
        - ./laravel:/usr/share/nginx/laravel

  mysql:
    image: mysql:8.0
    container_name: mysql-server
    networks:
      - laravel-docker
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=homestead
      - MYSQL_USER=homestead
      - MYSQL_PASSWORD=secret
    ports:
      - 3306:3306

  redis:
    image: redis:5.0-alpine
    container_name: redis-server
    networks:
      - laravel-docker
    ports:
      - 6379:6379

networks:
  laravel-docker:
    driver: bridge

詳細は下記(ハンズオン)

https://github.com/hexaforce/laravel-docker

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPの連想配列について(Progate)

学習コース

Progate
PHP 道場コース Ⅰ → 連想配列の操作をマスターしよう9. → 全ての価格を表示しよう

ソースコード

<?php
$menus = array(
  array('name' => 'CURRY', 'price' => 900),
  array('name' => 'PASTA', 'price' => 1200),
  array('name' => 'COFFEE', 'price' => 600)
);

// この下にコードを書いてください
foreach ($menus as $menu) {
  echo $menu['name']."は".$menu['price']."円です";
  echo '<br>';
}

?>

---出力結果---
CURRYは900円です
PASTAは1200円です
COFFEEは600円です

質問内容

  foreach ($menus as $menu) { ~~~~}

↑foreach内にあるこの[$menu]はどこからきたのでしょうか?
[$menus]は最初に定義されているのでわかるのですが。
例えばここが[$prices]なら[$price]といったように
単純に複数形「s」を取ったものになるのでしょうか?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

YYPHP#85「皆さんPHPで高負荷の処理はどうしてる?」「サーバレスアーキテクチャについて」「gRPCってみんな使ってる?」「ネームスペースが無いプロジェクトにComposerを組み込むには」

これは2019年5月24日に開催したPHPerイベントYYPHP#85のイベントレポートです。

YYPHPは一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催はほぼ毎週、高田馬場にて。

今回の配信動画

過去回の配信動画

https://www.youtube.com/playlist?list=PLpOeTEye3Bg6PodrLHHC72jWMJYZz8VbG

雑談

ネームスペースが無いプロジェクトにComposerを組み込む

  • WordPressで独自のプラグインを開発納品することがある
  • Composerでそのパッケージを管理したい
  • WordPressはPSR-4に準拠してない

Composerを入れたい目的

  • フォームのバリデーター、SNSのログインなどのパッケージを再利用したい。
  • WordPressのプラグインを開発しているが、そこにComposerパッケージを使いたい。

  • XOOPS CubeでComposer入れたことがある

    • index.php でAutoLoaderが
    • 複数ある場合、どのindex.phpからでも読み込まれるようにする

PHPからテンプレートに値を埋めていくのどうやっている?

  • Bladeを使っている
  • 不動産関係のアプリを作っていて項目が山のようにある
  • 効率的に埋める方法を知りたい
  • みんなどうやってる?

  • 配列にデータ入れて、回したらだめなの?

    • Bladeの良きところに入れたい
    • HTMLとCSSを見直せばバーっと行ける気がする
    • あとで見せます

PHPで高負荷の処理を皆さんどうやっている?

  • データベース
  • Laravel
  • Eloquentを外しちゃいがちだけど、あえて使いたいと考えている
    • キャッシュをうまく使うのが良いのでは?
  • イントランザクションにいる必要がある
    • Writeが多い
  • 台数増やす
  • 一旦Queueにつむ
    • 結果整合性は保てる
    • 画面には投げたデータで画面を返すか待つしかない
  • SSEで待たせるのが一番現実的かも
  • Node.jsの方が適してそう

    • PHPはストリーム処理できない
  • Queue

    • AWSだったらSQSかRedisが良さそう
  • Laravelでないといけない理由はあるか?

    • Lamdaではだめ?
    • Lamdaとかだと見積もりが出しにくい
  • PHPに限界を感じた時は?

    • Goで書いたことがある
    • PHPはスレッドが使えない、Goはスレッド化して複数プロセスを実行できる
  • GitLabのRunnerまわりのGo実装がチャンネルがちゃんとしている

  • PHPerが他の言語を学ぶ

Laravelの権限管理の機能について

ぬーぺっとさんのget-member.phpについて質問がある

  • データを取ってくるInterfaceの名前ってどんな単語が適切?

collector
fetcher
retriever

$event = new ConnpassEvent($url);
$members = $event->getMembers(); 

サーバレスアーキテクチャについて

  • 実際に使ってるのかとか、興味があるのかとかを知りたい
  • 使ったことある 3人
  • 使っていきたい 6人
  • KNative
    • Kubernatesでvendorに依存しないFaaSが作れるやつ
    • 金額が見積もれる
  • Lamda
    • 負荷に応じてスケールできる
    • 金額が見積もりづらい
  • CloudWatchから通知を受け取るときにLambdaで付加情報を加えるときに使っている
  • SAM(Serverless Application Model)

AWS上で冗長化されてるWordPressをEFSでマウントしてるけど遅いよ!どうしたらいいの!?

  • 画面からPluginをインストールしたら1つのサーバにしか配置されない。
  • APCとかOPCache?でオンメモリにPHPのファイルがロードされたように設定する
    • この方法の弱点はキャッシュが効くので新しいファイルが反映されない(されにくくなる)
    • キャッシュの期間の設定を工夫
  • EFSがびっくりするくらい重い
    • 並行数が1とか2だと遅いのでメリットがでない
    • 大量に読み書きするのに向いている
  • 同じVPCだったらNFSを素で使ったほうが速い

gRPCってみんな使ってる?

  • IDLっていいものだと思うので、ライブラリとか使ってるものがあれば聞きたい
  • PHPで使ったことない
  • gRPCって何? - Qiita

Pythonのフレームワークについて聞きたい

YYPHPは毎週やってます

PHPについてワイワイ話したい方は、YYPHPのイベント情報をチェックしてみて下さい。

以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います! では、また来週!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

51歳からのプログラミング 備忘 吹き出し的なもの

吹き出し的なもの(以下、吹き出しという)を作ってみた。

入力欄が空欄で入力した時に、
吹き出しで「未入力です」ってアナウンスが
フェードインして入る、って感じで。

・ 吹き出しを、cssで用意
・ 吹きさしのcssは、<input の後の <span に設定
・ 吹き出しのcssは、最初は非表示にしとく(display:none)
・ 吹き出したいときに、表示する(ここでは、submit時)

そんな感じで作れそうだったので作った。

表示位置の設定と、フェードインアウト,
入力時には非表示状態、をコードしてるので、
ちょっと長いのが残念。

完成コードはこれ
でも、吹き出しをフェードアウトさせるところが気に入らない。いつか直そう。

//------- jquery ----------
<script>
  $(function(){
    var position,width;
    var $form=$('form');
    var $inp =$('input[name="inp"]');
    var $sp  =$('span[name="sp"]');

    $form.submit(function(){
      if(!$inp.val()){
        position=$inp.offset();
        width   =$inp.width();
        $sp.text('未入力です');
        $sp.css('display','inline');
        $sp.offset({top :(position.top-1),
                    left:(position.left+width+10),
                  });
        $sp.hide().fadeIn(100);
        return false;
      }
    });

    $inp.on('keypress',function(){
      $sp.fadeOut(100);
    });
  });
</script>
//----------------------------


//---------- css -------------
<style>
  .tip    {display:none;
           color:white;
           background:blue;
           border-radius:5px;
           }
</style>
//----------------------------


//--------- html -------------
<form action="test" method="post">
  {{csrf_field()}} // これはlaravel仕様です
  <input name="inp">
 <span name="sp" class="tip"></span>
</form>

コードを打つだけで楽しい。
心が躍るような楽しさ。
こんな楽しいことがあったんだ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP: 配列が添字配列か連想配列かを判定する

PHPで、配列が添字配列か連想配列を判定する関数です。

// 判定する関数
function is_sequential(array $array): bool
{
    $keys = array_keys($array);
    return $keys === array_keys($keys);
}

// 以下テストコード

// 添字配列
assert(is_sequential([]));
assert(is_sequential([1, 2, 3]));
assert(is_sequential(['a', 'b', 'c']));
assert(is_sequential([0 => 'x', 1 => 'x', 2 => 'x']));
assert(is_sequential(['0' => 'x', '1' => 'x', '2' => 'x'])); // 後述1

// 連想配列
assert(!is_sequential([1 => 'x', 2 => 'x', 3 => 'x'])); // 1始まりなので連想配列
assert(!is_sequential([0 => 'x', 2 => 'x', 4 => 'x'])); // 0始まりだけど、0,1,2と連続しているわけでないので連想配列
assert(!is_sequential(['a' => 'x', 'b' => 'x', 'c' => 'x'])); // キーが0,1,2と連続しているわけでないので連想配列

後述1

PHPの仕様上、キーが文字列でも、添字配列になる場合がある。

var_dump(['0' => 'x', '1' => 'x', '2' => 'x']);
array(3) {
  [0]=>
  string(1) "x"
  [1]=>
  string(1) "x"
  [2]=>
  string(1) "x"
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CakePHP3にてセッションタイムアウトの時間を変更する方法

はじめに

CakePHP3にてセッションタイムアウト時間の変更方法についてまとめました

環境

CakePHP 3.5.17

TL;TD

  • config/app.phpのSessionにtimeoutを設定します
  • 設定しないと、php.iniの「gc_maxlifetime」の値となります

設定方法

  • Sessionにtimeoutの設定を追加する、単位は「分」
  • 以下は10分でタイムアウトするように設定しています
config/app.php
    'Session' => [
        'defaults' => 'php',
        'timeout' => 10
    ],

セッションの設定を追いかけてみた

  • timeoutを設定すると、gc_maxlifetimeを更新しているため、設定しないと、gc_maxlifetimeの設定値が有効になります
vendor/cakephp/cakephp/src/Network/Session.php
    public function __construct(array $config = [])
    {
        if (isset($config['timeout'])) {
            $config['ini']['session.gc_maxlifetime'] = 60 * $config['timeout'];
        }
    }
  • ちなみに、gc_maxlifetimeのデフォルトは以下となっています
    • session.gc_maxlifetime = 1440
    • 単位は秒なので、24分となります

まとめ

  • CakePHP3でセッションタイムアウトを変更したい方は参考にしてみてください

参考

PHP:実行時設定
Cookbook セッション

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WordPressでYouTubeのoEmbed埋め込みをカスタマイズ

内容

WordPressで外部コンテンツ埋め込みに使われるoEmbedはパラメーターを自由に設定できません。
ここではYouTube動画をiOSでインライン再生されるようにするplaysinlineパラメーターを追加してみます。
array_merge()の第二引数を調整することで関連動画の設定なども簡単にできます。

コード

functions.php
function embed_oembed_html_custom($cache, $url) {
  if (strpos($url, 'youtube.com') !== false || strpos($url, 'youtu.be') !== false) {
    return preg_replace_callback(
      '/<iframe.*?src\s*=\s*["|\'](.*?)["|\'].*?>/i',
      function($matches) {
        $url_query = parse_url($matches[1], PHP_URL_QUERY);
        if (empty($url_query)) {
          $query = array();
        } else {
          parse_str($url_query, $query);
        }
        $new_query = array_merge($query, array('playsinline' => '1'));
        $new_src = add_query_arg($new_query, $matches[1]);
        return str_replace($matches[1], $new_src, $matches[0]);
      },
      $cache
    );
  }
  return $cache;
}
add_filter('embed_oembed_html', 'embed_oembed_html_custom', 10, 2);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php-master-changes 2019-05-23

今日は run-tests.php で memcheck 以外の valgrind の tool 指定ができるようにする修正、opcache のバグ /race 修正と最適化処理の修正、リンクの済んでないクラスを利用しようとして SEGV が出るケースがあった問題の修正、socket_select() が参照を含むリソースの配列を渡した際に正常動作しない問題の修正、テストの並列実行対応の改善、php-fpm からの利用の際ランダムに SEGV が出る問題の修正があった!

2019-05-23

krakjoe: add support for valgrind tools to run-tests.php

dstogov: Fixed dump of constant flags

dstogov: Fixed race condition in opcache restart

nikic: Don't require NO_ESCAPE for partial arrays in SCCP

dstogov: Fixed double mutex unlock

nikic: Forbid use of not fully linked classes

krakjoe: run-tests improvements:

nikic: Fixed bug #78038 socket_select with references

cmb69: Prevent potential test conflict

krakjoe: fix notice in run-tests

cmb69: Prevent further potential test conflicts

nikic: Fix bug #77955

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む