- 投稿日:2019-05-24T23:59:19+09:00
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イメージ
今後の追加予定
- 特殊処理をする文字を追加する
- 文字サイズによる位置調整の細分化
- テキストの折り返しと改ページの処理
- その他もろもろ処理の汎用化
役に立ったサイト
- TCPDF 公式サイトです。サンプルが豊富にあります。
- TCPDFマニュアル(勝手訳) 縦書きの方法は使いませんでしたが、リファレンスとして一番活用させていただきました。
- 投稿日:2019-05-24T23:19:41+09:00
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 zipdocker-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詳細は下記(ハンズオン)
- 投稿日:2019-05-24T21:23:51+09:00
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」を取ったものになるのでしょうか?
- 投稿日:2019-05-24T21:11:58+09:00
YYPHP#85「皆さんPHPで高負荷の処理はどうしてる?」「サーバレスアーキテクチャについて」「gRPCってみんな使ってる?」「ネームスペースが無いプロジェクトにComposerを組み込むには」
これは2019年5月24日に開催したPHPerイベントYYPHP#85のイベントレポートです。
YYPHPは一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催はほぼ毎週、高田馬場にて。
今回の配信動画
YYPHP | PHPerの雑談イベント@毎週金曜・高田馬場 https://t.co/xH5Ec04mQs
— suin❄️PHPでオブジェクト指向 (@suin) 2019年5月24日過去回の配信動画
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が他の言語を学ぶ
- Scalaはちょっと時間かかりそう
- Goは割と学べると思う。だいたい38日間でw
Laravelの権限管理の機能について
- LaravelのMiddlewareで権限チェックするようにできる
- ルーティングで権限
- Authorizationという仕組みがある
ぬーぺっとさんの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のフレームワークについて聞きたい
- PHPのフレームワークと比べて、おすすめのフレームワークはあるか?
django以外知らない
2018年大注目のPython!WEBフレームワーク3つを徹底比較 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
- Bottle
- Flask
- Python用のマイクロフレームワーク
- Django
- 普通のMVCフレームワーク
わざわざPythonでWebする理由って?
GitHub - twisted/twisted: Event-driven networking engine written in Python.
YYPHPは毎週やってます
PHPについてワイワイ話したい方は、YYPHPのイベント情報をチェックしてみて下さい。
以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います! では、また来週!
- 投稿日:2019-05-24T20:23:31+09:00
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>コードを打つだけで楽しい。
心が躍るような楽しさ。
こんな楽しいことがあったんだ。
- 投稿日:2019-05-24T10:54:40+09:00
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" }
- 投稿日:2019-05-24T10:45:43+09:00
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.phppublic function __construct(array $config = []) { if (isset($config['timeout'])) { $config['ini']['session.gc_maxlifetime'] = 60 * $config['timeout']; } }
- ちなみに、gc_maxlifetimeのデフォルトは以下となっています
- session.gc_maxlifetime = 1440
- 単位は秒なので、24分となります
まとめ
- CakePHP3でセッションタイムアウトを変更したい方は参考にしてみてください
参考
- 投稿日:2019-05-24T10:24:00+09:00
WordPressでYouTubeのoEmbed埋め込みをカスタマイズ
内容
WordPressで外部コンテンツ埋め込みに使われるoEmbedはパラメーターを自由に設定できません。
ここではYouTube動画をiOSでインライン再生されるようにするplaysinline
パラメーターを追加してみます。
array_merge()
の第二引数を調整することで関連動画の設定なども簡単にできます。コード
functions.phpfunction 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);
- 投稿日:2019-05-24T09:36:13+09:00
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
- https://github.com/php/php-src/commit/536532c57255b8c616d25251031427c5aa8d7d42
- [7.4~]
- run-tests.php で、memcheck 以外の valgrind の tool 指定ができるよう修正
dstogov: Fixed dump of constant flags
- https://github.com/php/php-src/commit/aa9c76d027d65467b4cd8db16fea8053d926e846
- [7.3~]
- ext/opcache で、デバッグ用の zend_dump_unused_op() のコードで定数のフラグの扱いを修正
dstogov: Fixed race condition in opcache restart
- https://github.com/php/php-src/commit/fa6a4483e63d87608a839d04c6e1b9eed9a0430f
- [7.2~]
- ext/opcache で、リスタート時の race を修正
nikic: Don't require NO_ESCAPE for partial arrays in SCCP
- https://github.com/php/php-src/commit/dcccdc471d7c6794ff9b13d3dc9c248bf7c16da9
- [7.4~]
- ext/opcache で、SCCP 最適化での部分配列の扱いを修正
- 最近のバグ修正で NO_ESCAPE の制限なしでも最適化できる範囲が広がった、という奴かな
dstogov: Fixed double mutex unlock
- https://github.com/php/php-src/commit/fdb7fc6153cfa8788d11e3dc74bc4f899bcdd42a
- [7.4~]
- ext/opcache で、accel_finish_startup() 時に二重に mutex を解放する箇所があったのを修正
nikic: Forbid use of not fully linked classes
- https://github.com/php/php-src/commit/64918c770282c0f60b407e8de3201a6b68c88e78
- [7.4~]
- リンクの済んでないクラスを利用しようとして SEGV が出るケースがあった問題の修正
krakjoe: run-tests improvements:
- https://github.com/php/php-src/commit/e1151c9549cf5a7235c1609019f79bbb1bbcdbea
- [7.4~]
- run-tests.php の改善
- memcheck 以外の valgrind ツールを使うため XLEAK セクションを追加
- XLEAK はリークのテスト用に使う
nikic: Fixed bug #78038 socket_select with references
- https://github.com/php/php-src/commit/9a74b23297167ca7956fd21428c8b987e7d99aa5
- [7.2~]
- ext/sockets で、socket_select() が参照を含むリソースの配列を渡した際に正常動作しない問題の修正
cmb69: Prevent potential test conflict
- https://github.com/php/php-src/commit/ced8760ca8533339ba8336b9ee32cbea3c873683
- [7.4~]
- テストの一時ファイルのファイル名衝突を回避して並列実行対策
krakjoe: fix notice in run-tests
- https://github.com/php/php-src/commit/979e7d0feeb3995fde84bdc4e60ba856d6056954
- [7.4~]
- run-tests.php で、配列の要素チェックが足りなかったのを追加
cmb69: Prevent further potential test conflicts
- https://github.com/php/php-src/commit/c70975e0a545b0df6bf5746067ff7c4c5cd6bbf7
- [7.4~]
- windows_links のテスト用の並列実行対策でとりあえず CONFLICTS を用意
nikic: Fix bug #77955
- https://github.com/php/php-src/commit/6f9dfd947302f9a0d2fa6a78bf385b1ca7dafdf3
- [7.3~]
- ext/mysqlnd で、php-fpm からの利用の際ランダムに SEGV が出る問題の修正