2017年10月4日水曜日

PocketMineの旧プラグインAPI対応方法

pmmp公式のプラグインAPIが変更となりました。
が、多くのプラグインは新APIに対応していません。
あえて新APIにプラグインを書き直す理由もわからないので、スクリプトを組みました。

Error: Declaration of DevTools\DevTools::onCommand(pocketmine\command\CommandSender $sender, pocketmine\command\Command $command, $label, array $args) must be compatible with pocketmine\command\CommandExecutor::onCommand(pocketmine\command\CommandSender $sender, pocketmine\command\Command $command, string $label, array $args): bool

こんなエラーがAPI不一致で発生します。

https://github.com/haniokasai/PocketMine-OldAPI-Replacer

型をコマンドで置き換える単純なものです。


http://jenkins.haniokasai.com/view/PocketMineS/
ここのsrcはすべて旧APIのものです。置き換えるのが面倒ならば、お使いください。


Ubuntuでのネットワークアダプタの探し方。

/etc/network/interfacesに
auto eth1
iface eth1 inet static
とか書きますけど、なんでeth1断定できるのかわけわかんない。
どんな環境でも絶対eth0とか1なのかよ。。。

そんなことはありません。てなわけで、ネットワークアダプタの探し方を紹介します。
ls /sys/class/net
すると、アダプタ一覧が表示されました。
[email protected]:~# ls /sys/class/net
enp0s3  enp0s8  enp0s9  lo
[email protected]:~# vi /etc/network/interfaces
^[[[email protected]:~# ifup enp0s3
Internet Systems Consortium DHCP Client 4.3.3
Copyright 2004-2015 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/enp0s3/0ああああ
Sending on   LPF/enp0s3/0ああああ
Sending on   Socket/fallback
DHCPDISCOVER on enp0s3 to 255.255.255.255 port 67 interval 3 (xid=0xebc6721b)

DHCPDISCOVER on enp0s3 to 255.255.255.255 port 67 interval 6 (xid=0xebc6721b)
DHCPREQUEST of ああ on enp0s3 to 255.255.255.255 port 67 (xid=0x1b72c6eb)
DHCPOFFER of ああ from あああ
DHCPACK of ああ from あああ
bound to ああ -- renewal in 40279 seconds.
[email protected]:~# 
[email protected]:~# ping haniokasai.com
PING haniokasai.com (104.27.142.118) 56(84) bytes of data.
64 bytes from 104.27.142.118: icmp_seq=1 ttl=54 time=57.0 ms
64 bytes from 104.27.142.118: icmp_seq=2 ttl=54 time=55.6 ms
^C
--- haniokasai.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 55.672/56.344/57.017/0.713 ms
[email protected]:~# 

ようやくネットが使えるようになりました。。。
うまく動かなくなったvirtualboxで。。。

参考文献
https://askubuntu.com/questions/293816/in-virtualbox-how-do-i-set-up-host-only-virtual-machines-that-can-access-the-in



2017年9月23日土曜日

PocketMine(pmmp) Minecraft PE1.2対応版phar配布

こんにちは。はにおかさいです。
アプデ対応がつらかったのですが、公式を改造して使用可能な状態にしました。

注意:PHP7.2ですので、Binの更新が必要です。
ソース https://github.com/haniokasai/PocketMine-MP/
phar   http://jenkins.haniokasai.com/job/PocketMine-72/

バイナリ: Linux x64 https://jenkins.pmmp.io/job/PHP-7.2-Linux-x86_64/
Windows https://ci.appveyor.com/api/buildjobs/30k579nj3xn4kc5j/artifacts/php-7.2.0RC2-vc15-x64.zip

本家との違い:
onCommandが旧API仕様なので、プラグインの更新の手間がない。

composerをごまかした

pluginのapiバージョンの無視

2017年8月21日月曜日

無料のMinecraftPEマルチプレイサーバーのMiRmMCPE運営して早2ヵ月...

どうも。はにおかさいです。

MiRmを運営して早く、2ヵ月経ちました。6月14日から運用しています。

mirm.infoとは、MinecraftPE/PCの完全無料のレンタルサーバーです。
プラグインはすでにいれてあるものを使えます。

そもそも、MiRmの名前の由来を知っていますか?私はあまり知りませんw
たぶん、MiはMinecraft,Rmはもともとの仮プロジェクト名”Racoom”が由来します。

運用していて、いくつかわかったことがあります。


・Javaは割と長く動かしてもメモリリークしない
-かなり安定して動いてます。

・やっぱ利用者の質は、、、
-小中学生の利用者が多いので、どうしても民度が下がるようです

・内容がマンネリしやすい
-プラグインがダブるので、どうしても

・バグ報告がうまくいかない
-利用者的にあまり報告がうまくなされません。チャット検索等で運用状況をすくう必要があります。

・使いこなせないユーザーも一定数いる
-使い方を理解したユーザーが教えあっているようで、一応はなんとかなっています。


今は夏休み需要で利用客が多いのですが、今後も維持するにはさらなる改善が必要とは感じます。ただ、有料の方との兼ね合いもあるのでなかなか大変そうです。

☆課金制度は導入しないと思います




2017年8月20日日曜日

[PocketMine-MP]チャット制限プラグイン公開!

こんにちは、はにおかさいです。
今回は、MiRmで使っているチャット制限プラグインを公開します。

https://github.com/haniokasai/ChatPermitter/

このプラグインは、MiRmで嫌われているプラグインナンバー1でしょう。



こんな感じでチャットを制限できます。

こうするメリットは、チャット荒らしや、不毛な会話を減らすことができます。
コードも公開してますから、自由に改造しちゃってください。

@config_enable コンフィグを読むか
@chaturl チャットコードを見れるurl
@deleteurl チャットコード消化用url
@deleteday チャット権限の削除日数

2017年7月17日月曜日

cloudflareのUnder DDoS Modeのサイトからファイルを拾ってくる in Python

こんにちは、haniokasaiです。

https://forum.pmmp.jp が廃止になるため、慌ててデータを落としたくなりました。

https://github.com/haniokasai/XenDownloder

こちら。

import cfscrape


scraper = cfscrape.create_scraper()


print scraper.get("https://forum.pmmp.jp/").content
これで、ふつーのテキスト的な感じでダウンロードできます。

res = scraper.get("https://forum.pmmp.jp/attachments/" + str(i) + "/", stream=True)
fname = re.findall("filename=(.+)", res.headers['content-disposition']) #ファイル名を取得します。
parsedfname = fname[0].replace("\"", "")
#phar名編集
\
if res.status_code == 200:
with open(parsedfname, 'wb') as file:
for chunk in res.iter_content(chunk_size=1024):
file.write(chunk)

こちらのコードで、ファイルを保存できます。

これで、cloudflareがあってもdlできます。

参考;https://torina.top/detail/161/

2017年6月12日月曜日

Javaがメモリ足りてるのにメモリ不足で動かないとき。Ubuntu

Javaで、立ち上げるとKilledやら強制終了やら、
Native memory allocation (mmap) failed to map 262144 bytes for committing reserved memory.
やらOut of memoryとか言われることがあります。
でもメモリは10GBほど余っています。

4時間ほど格闘した末、Jenkinsだけがはっきり答えを示してくれたので、まとめました。


環境 Ubuntu 16.04 64Bit ,"Oracle" Java 8

最初に以下のことを試してみました。

Javaが動いてると、Text file Busyって言われますから、
killall Java
killall Java
killall Java
....
でJavaを殺してあげてください。

初回の時のみ最初に(このコマンドが扱える形式にする?そうです)
paxctl -c /usr/lib/jvm/java-8-oracle/jre/bin/java

1度でいいかは不明ですが、MPROTECTを解除します。
paxctl -m /usr/lib/jvm/java-8-oracle/jre/bin/java

これで、立ち上げられました。と思ったらこれでもダメ。

仕方ないので、OOM Killerに黙ってもらうことにしました。

テキストエディタで  /etc/sysctl.confに追記してください。

vm.overcommit_memory = 1

保存して、コンソールで

sysctl -p

と打つとapplyされます。これで解決したのですが、根本的な対策ではないと思うので、原因が見つかったら直さないといけませんね。この修正で今のところシステムは快調です。


参考

https://stackoverflow.com/questions/27262629/jvm-cant-map-reserved-memory-when-running-in-docker-container

http://passingloop.tumblr.com/post/11957331420/overcommit-and-oom-killer

2017年5月28日日曜日

nginxでライブストリーミング!nginx-rtmp-module

生配信サーバーを構築してみたかったのですが、nginxのエクステンションでできることがわかって構築しました。
サーバーはこれで構築できました。
macbook air obs-(wifi 100mbps)>ubuntuサーバー-(wifi)>macbook air vlc
での遅延が3秒のようですから、私には実用的な遅延レベルです。

しかし、クライアントがHLSとなると36秒遅延しています。

なぜそうなるのかはどうやら、HLSは遅延をなくすには向いていないようです。
HLSでも遅延を減らせなくはなさそうなので、最初はHLSで頑張ってみます。
今回の受信者はAndroidを想定しています。視聴者は少数であるという想定です。

まずは、nginxのrtmpの設定で、

# HLS fragment の長さ(1個のtsファイルの動画の長さ)
hls_fragment 1s;

としてみました。

すると、遅延は25秒になりました。

続いて

#m3u8ファイルに何秒分のtsファイルを掲載するか
hls_playlist_length 4s;
#なぜか必要です 
wait_video off;



遅延が22秒!
ただし、安定性が落ちるようです。

この秒数を2とするとそもそも開けなくなりました。

次に、

hls_max_fragment 8s;

としてみます。

すると、、、
遅延を17秒までにできました!うぅ!

4秒にしてみます。

12秒までに削減できました。

2秒にすると、14秒になるので減らし過ぎもいけません。

ところが
githubのissueを見ようとした時に、誤って、リポジトリ検索したら、html5でrtmpを見るというものを見つけてしまいました。


なので、HLSでの試みはここで放棄します()


留意点
これらの低遅延の設定を施すと、cpuに負荷がかかります。core i7の 37なんとかsだかtでやったのですが、1コアだけ与えた仮想マシンで、cpu100パーセントにしばしばなりました。
vpsで構築する人には辛いかもしれません。


余談
OBSの配信停止をしてから、nginxを止めないと、OBSがクラッシュします

参考文献

2017年5月24日水曜日

Minecraft PEサーバーソフトウェア集(PocketMineと多言語サーバー)2017年5月版

こんにちは、haniokasaiです。
PocketMine-MP公式がshogicp氏のMojang入社に伴い死んでしまったため、どのサーバーソフトを使えばいいかわかんないという人は非常に多いです。
ですから、いつものように私がソフトをまとめていきたいと思います。

☆言語別にまとめます。

PHP

PocketMine派生

PocketMine-MP
開発:pmmpチーム(リーダーはhttps://github.com/dktapps
ライセンス:LGPLv3
開発状況:活発

公式を半ば乗っ取った形でスタート。必要最低限の機能を持っていて、あまり機能追加をしない。dtkappsは性格が悪いため、Genisysを終わらせた人の1人。バグは少ない。

開発:BlueLightJapan(リーダーkametan0730MC)
ライセンス:GPLv3
開発状況:活発

かめたんが率いるBlueLight.https://github.com/ken77731により、設立が提案。
政治的に安定しており、新機能追加・バージョン対応がいち早い。ほかのsrcに比べると、開発環境が自由で、おのおのが独立して新機能更新している。そのためか、バグが多い。

Steadfast2
開発:Hydreon Corporation
ライセンス:LGPL2
開発状況:それなりに活発

Lifeboat 鯖のSRC。新バージョン対応が早い。ただそこまで実用的なSRCではない。一応企業開発のため滞りは少ない。

ExtraCorePE
開発:ExtraCorePE
ライセンス:GNU Affero General Public License v3.0
開発状況:やばそう(悪い意味で)

日本人のNought57(零月)が所属。チーム内でごたごたがあって、更新はあまりよくない。一部人に人気なそう。

開発:TesseractTeam
ライセンス:GPL3
開発状況:細々と更新

Genisysベース。機能の多さと、動作の安定が両立できている。それなりに人気のSRC。この怪しげなデベロッパーhttps://github.com/AppleDevelopsはPMMP界の破壊に奮闘していた時期も。
チーム内では争いが絶えないよう。

開発:EventaxhlTeam
ライセンス:
開発状況:たまに

ロシア製SRC。Tesseractベース。更新頻度が低いが細々と続けられてはいる。ロシア語メインなので日本人にはわけわからない。コマンドでコードが実行できるらしいがevalなので危険そう。


Nukkit
開発:Nukkit
ライセンス:GPLv3
開発頻度:活発

みんな大好きNukkit。共産圏の開発者が多い。プラグインも非PMMPにしては一番多いし、私haniokasaiもそれなりに作りました。プラグイン開発も容易です。
機能追加は消極的、バグは多くない。
パフォーマンス的にJavaを生かし切れていないと指摘される。

BukkitPE
開発:BukkitPE
ライセンス:GPLv3
開発頻度:一定程度安定

あまり有名でない。ドメインやVPSが死んでるものの開発は続いているよう。レッドストーンが使えます。

死んでる
voxelwind

C#
MiNET
開発:NiclasOlofsson
ライセンス:Mozilla Public License 2.0
開発頻度:なぜか活発

ある意味、一番息の長いサーバーソフト。機能はほぼなく、すべてプラグインで補う必要がある。プラグインは作りやすいが、機能がなさすぎる。コードは一番洗練されていると感じる。噂によると、コードをmojangからもらっているそう。

D言語
sel-server
開発:Kripth
ライセンス:LGPLv3
開発頻度:活発

次世代のサーバーソフト。更新は異様に活発だが、企業が関与しているのだろうか?
ハブとノードで分散できるのが最大の特徴。
残念ながらD言語がわからないので詳細がわからずテストもできず。

停止
Swift
SwiftMine
開発:
ライセンス:Apacheライセンス
開発状況:停滞
C++
BenchMine


まとめ
サーバーソフトは生まれては消えを繰り替えしているのですが、なんとか消え失せたりはしていません。PCに比べて活発さはないのですが、公式のサーバーソフトがない故、特色のあるMCPEサーバーは多くあります。死んでいて紹介していないものもありますけど、多くを網羅できていると思うので、是非参考にしてみてください。

2017年5月5日金曜日

MCPEのパケット解析結果を見れるサイト!

こんにちは、haniokasaiです。
すごそうなサイトを見つけたので紹介します。
D言語で書かれた、MCPEサーバープロジェクト、https://github.com/sel-projectで、パケット解析をしていることに気づきました。
Githubでサーフィンしていたら、たまたまphpやjavaなど多数の言語のMCPEのライブラリを見つけて、その投稿者のホームページをみたら、詳細な解析結果が載っていました。

https://sel-utils.github.io/



















上から、Minecraft PC、MCPE,Raknet,(sel-serverの)hubとnode通信パケット、(sel-serverの)外部からwebsocketで操作するパケットが書かれています。

たとえば、https://sel-utils.github.io/pocket/112.htmlを見てみると、1つ1つのパケットの型、id、サーバーかクライアントが処理するかが書かれています。
これさえ読み解ければ、パケット解析をしなくとも、パケットが読めるというわけです。

しばらくはブログ更新できそうですので、その読み方を解説できればなぁと思います。

2017年5月4日木曜日

appwchr氏のMCPEのマルチプレイアプリで遊んでみた!

こんにちは、はにおかさいです。
精神状態がやばいけれども、それがある意味安堵できる状況でもあるという状態です。

mixiappwchr氏がマルチパーティというアプリを作ったようなので、レビュー書きます。
彼はもともとおしゃまるプロジェクトの開発者でしたが、おしゃまるがなんやかんやで終わってしまいました。でもマイクラで何かをしたかったそうで、今回のマルチプレイのアプリを作ったようです

Android端末が2台ありますので、試してみました。

まず、マイクラPEとマルチパーティーをインストールします。

次に、開きます

許可を開始を押します。(オレンジ色のボタンは長押ししないと反応しないのでしょうか。)


心優しいappwchr氏は変なことをしないと思うので、許可。


許可。

これも許可してください。

設定はこれで終了です!


ーーマルチプレイのワールドを開く側ーー

「パーティー」を作るには、パーティー名を決めて、右下のオレンジボタンを押してください。


名前を決めて、「開始」ボタンを長押しします。
根気強く工夫して押さないとなぜか反応しません。

このあと、マイクラPEのアプリが立ち上がるので、マルチプレイしたいワールドを開いてください。


ーーマルチプレイに参加する側ーー
設定後、アプリを立ち上げます。


先ほどのパーティー名と同じパーティーを押します。




パーティーに参加の参加ボタンを長押しします。


遊ぶを押します。


LANゲームにパーティーを開いた人の名前の部屋があるはずなので、それを押して、参加します。

読み込みを待つと、、


マルチに入れました!


感想
mob等をふ化させて、動きを確認しましたが、今回のこのアプリはおしゃまると違って、サーバーを通さないで通信するので快適にできました。
コマンドはうまく使うことができません。
欠点としては、パーティーに入る際、許可がいらないので、知らない人がどんどんきちゃうことです。テスト中も関係ない人が入ってきて困惑しました。
まだまだ、開発途中ですので、そこは改善してほしいです。。。
1年ほど前、まだ自分に割と友達がいたころにこのアプリがあったら、結構使ってたことでしょうね....
どんどんこれからもMCPEの記事を書けるのであれば、書きたいと思っています。









宇都宮で餃子食べてきた!

どうも、はにおかさいです。
GWどこにも行かないのも寂しいので、宇都宮で餃子食べてきたました。

数時間かけて、宇都宮に行ったのですが、思った以上に栄えてまして驚きました。

まずは、宇都宮 みんみん ステーションバル店に。
11:8ごろ(GWの水)に行ったのですが、一応並ばずには入れました。
注文してから15分後、商品が届きました。

水餃子と焼き餃子を注文、安かったのですが味もそこそこでした。
店には遠出をしていて途中で寄ってる人が多いようです。新幹線もありますからね。


つぎは、同じ駅ナカ(あとで建物が同じことに気づきました())の青源に行きました。
(11:30ごろから)15分ほど並び、店に入って、注文。また10分ほどたったら、オーダーしたものが来ました。

ネギみその焼き餃子
程よい濃さのみそで、ねぎも味噌が染みてて、今回食べた餃子の中では一番気に入りました。


水餃子。みそに浸かってて、味が染みています。スープは酸味が効いてて、餃子にあいますが、飲むには少し酸っぱい気がします。(スープも飲めると書いてあるので飲むことも想定されてるでしょう。)

宇都宮駅から15分ほど歩いて、来らっせ本店に着いた(13時ごろ)のですが、数
十人が既に並んでいて、とても並ぶ気になれなかったのであきらめました。

そっから、オリオン通りに行きました。昔の商店街みたいなところでしたが、正直見どころは少ないです。

歩いていたら、餃子ナンピザなるものを発見!ヒルズカフェ(HillsCafe)という店でした。

店内は、一階がお土産ショップ、2階がレストランです。レストランはファストフードのコーナー的なものを想定して行ったのですが、レストラン色が強かったです。

味はいいのですが、 具が少ない 上に載ってる餃子の焼いた皮がもはやただのせんべい 冷めてる ナンという割には、薄すぎる生地 隣の客がキ〇ガイでからまれた(店関係ないww) 
でいい気分しませんでした。ラー油をかけると、餃子っぽくなっておいしいです。
店はかなり空いてました(二時半ごろ)

また、ぶらぶらしたら、宇都宮餃子館を発見しました。


店内に入るのに、10分(3時ごろ)、店内では2,30分待たされました()


川越シェフも来たことがあるようw


湯葉入り餃子。高いですけど、おいしい。具はほんのり湯葉感がしました。
わさびをつけて食べます。
皮は一番おいしかったです。ちょうどいい歯ごたえ。。。

帰り、駅前の「餃天堂」に行こうとしたのですが、15:30にもかかわらず、1時間以上ほど並んでいそうだったのであきらめて帰りました、、、。
食べたかった。。。。

まとめ
味としては、ねぎみそ焼き餃子。餃子の皮は宇都宮餃子館の餃子がよかった。
んー。全体的に店が混んでます。ゴールデンウイークだったからでしょうか。
正直、宇都宮の名所というものはなさそうなので、行くとしたら餃子食べ歩きがメインになりそうです。
後悔としては、オリオン通り近くの焼きそば屋に行きたかったことです。
店が一見さん厳しい感じだったので入れませんでした。。。
焼きそばが250円。かなり安い。おいしいのかなぁ。
1日中歩き回ってへとへとです。文章のグラマーもなんか変かもしれません。
初食レポ記事なので、だいぶ編集が雑ですけど、ご容赦くださいませ。

2017年4月30日日曜日

[PocketMine] Pharファイルをwebで作る!解凍する!

こんにちは、haniokasaiです。
pharをいちいちdevtoolsで作ったり、展開したりするのが面倒な方に便利なツールを用意しました。
pmt.haniokasai.com

機能は4つ。

ZipからPharに変換

PharからZipに変換する

var_dump() ビュアー

PocketMineのCrash Dump解析

上2つは需要ありそうなので、使い方を解説したいと思います。

ZipからPharに変換

zipを選択して、検査が必要であればチェックを入れ、pharの作成を押すだけで完了できます。
devtoolsでやると、いちいちmakepluginでプラグイン名を入れる必要はありますが、pmtでやればそのような事は不要です。


PharからZipに変換する
    
ファイル選択ー>変換だけでおしまいです。解凍禁止コードを無視して開くこともできますが、(両親ではなく)良心に従って、適切に使ってください。


まとめ
近頃は、たいぶPMMP界が停滞しているように思えます。ですから、新しいデベロッパーが簡単にプラグインを作れるようになれば、界隈が活性化するのではと思います。
自分の記事を読んで、開発に関して知識を深められたらうれしいです。


2017年4月27日木曜日

phpのバイナリをramdiskとhdd上で動かして速度比較してみた

こんにちは、haniokasaiです。比較的精神が落ち着いています。
サーバーで、ramdisk使ってるのですがあまり速くない気がして、そもそもramdiskはファイル読み書き以外にも効果があるのか検証したいと思いました。

チェック環境
Core i7 3770s
ram 16GB(4.1 GB/s)
hdd 300gb(100MB/s)


ハッシュ値計算
まずは、ハッシュ値計算。明らかにcpuしか使わないとは思うのですが試してみました。

<?php
$time_start = microtime(true);
// ここに測定したいPHPの処理を記述
//http://qiita.com/ao_love/items/a2d8b8566d0426195002
$i=1;
while($i <= 10000){
echo hash(sha512, 'hoge hoge');
echo PHP_EOL;
$i++;
}
$time = microtime(true) - $time_start;
echo $time . " seconds\r\n";
?>

ramdisk
2.385381937027 seconds
2.3838350772858 seconds
2.381500005722 seconds
2.385363817215 seconds
2.3823990821838 seconds

hdd
2.386225938797 seconds
2.3824648857117 seconds
2.3904531002045 seconds
2.385146856308 seconds
2.3851881027222 seconds

変わらないですね()

変数に代入+擬似乱数速度

<?php
$time_start = microtime(true);
// ここに測定したいPHPの処理を記述
//http://qiita.com/ao_love/items/a2d8b8566d0426195002
$i=1;
while($i <= 100000){
$a[$i] = mt_rand();
echo $a[$i];
echo PHP_EOL;
$i++;
}
$time = microtime(true) - $time_start;
echo $time . " seconds\r\n";
?>
#test2.php
disk
2.1107099056244 seconds
2.1114587783813 seconds
2.1099500656128 seconds
2.1052420139313 seconds
2.085608959198 seconds

ramdisk
2.1087579727173 seconds
2.1096110343933 seconds
2.1064808368683 seconds
2.1081149578094 seconds
2.111673116684 seconds

やはり同じような値ですね。。。
(単位は秒)
##データはハードディスクにおいて
#bin:ramdisk phar:ramdisk 
0.19
0.19
0.171

#bin:disk phar:ramdisk 
0.184
0.211
0.228

#src:disk phar:disk
0.192
0.202
0.191

#bin:ram phar:disk
0.164
0.191
0.169

#ramdiskにファイルを置いて
#bin:ram phar:disk
0.193
0.197

#bin:ramdisk phar:ramdisk 
0.179
0.18
0.181
0.219

#bin:disk phar:disk
0.195
0.183
0.213
0.176
0.169

まとめ
 差はほぼ生まれないという結果が出ました。やはり読み書きを多くするプログラムでないとramdiskを生かすことはできなさそうです。

2017年4月6日木曜日

PocketMine-MPでマルチスレッド処理をする!Thread/AsyncTask

こんにちは、haniokasaiです。
誰も、PocketMine-MPのマルチスレッドについてまとめた人がいなかったのでまとめてみます。

イントロ
phpで書かれたpocketmineは重いです。それは、保守のかんたんさと引き換えにそうなっているのでしょうが、特にcurlで外部のapiにアクセスをするものを使うときには全体の処理を遅らせてしまうことでしょう。
そもそも、PMMPのbinには、pthreadが同梱されていますが、単純に使うことはどうやら
できないようです。そこでどうしようかなぁと思ってたら、記憶がうろ覚えなのですが、pocketmine\threadを使うと良いと、おぎわらが教えてくれました。彼は私の夢で何故か一度登場したことがあります。
マルチスレッドについては、検索すればいい説明が読めます。


プラグイン例
https://github.com/haniokasai/PocketMine-Thread/

Thread
threadは、返り値の伴わないスレッド処理ができます。ですから、serverlistの情報送信のような一方的な作業に使うことができます。

        $job1 = new thread_ex1("Hello");
        $job1->start();

class thread_ex1 extends Thread
{
    public function _construct($data)
    {
        $this->data = $data;
    }
    public function run()
    {
        echo $this->data;
       Server::getInstance()->getLogger()->notice($this->data);// 動かない、無言だがエラーとなる
    }
}

最初の $job1 = new thread_ex1("Hello");
で、仕事を生成します。
()内には、引き渡したい変数をかけます。
(引き渡し先は、_construct($data)です。この関数の中に $this->data = $data; と定義してあげると、run内で利用できます。)
$job1->start(); で仕事実行です。
すると、_construct、runの関数の順に実行されます。
ただし、run内で、phpで書いた関数はスレッドクラス外から呼び出せないです。


AsyncTask
これは動作完了時に、任意の作業をさせることができます。ですから、webに接続するタイプのログインプラグインであっても、通信が完了した時にログインを完了させれば、他の人がラグを感じずに済むわけです。

$this->getServer()->getScheduler()->scheduleAsyncTask($job4 = new thread_ex3(Server::getInstance()));

class thread_ex3 extends AsyncTask
{
public function __construct($instance)
{
$this->instance =$instance;
}
public function onRun()
{

echo PHP_EOL."job3 1-2";
//$this->instance->getLogger()->notice("job3 1-1"); //動かない、無言だがエラーとなる
}
public function onCompletion(Server $server)
{
echo PHP_EOL."job3 2-2";
$server->getLogger()->notice("job3 2-1");
}
}

最初の、 $job4 = new thread_ex3(云々 の変数で、仕事を作成、scheduleAsyncTask で開始させています。
すると、_construct が実行、onRun が実行され、 onRunが完了すれば、onCompletionが実行されるでしょう。
onRun内では、外部の関数が実行できませんが、onCompletionでは、Serverの変数が渡されるので、$server を$this->getServer()として見なせば、pmmpが操作できます。

イントロの逆ってアウトロなんですね!
以上、マルチスレッドの方法について、まとめてみました。
サンプルプラグインを触れば、何ができるかよりわかると思います。
もともと、ある人の鯖の軽量化のためだけに考えたのですが、もうその人は鯖をやめてしまい、自分も開かないことをその人に進めたので、墓場(github)に埋もれていました。ですから、せっかくなので拾い上げ、記事にしました。
これで少しでも使う人が増えたらいいなと思います。今回はざっとしか書いてないですけど、反応を見て続編を書きたいです。

参考:

https://github.com/pmmp/PocketMine-MP/blob/master/src/pocketmine/scheduler/AsyncTask.php
https://github.com/organization/SpawningPool
 お世話になった、おぎわら、ありがと!
https://twitter.com/CostlierRain464

PocketMineの旧プラグインAPI対応方法

pmmp公式のプラグインAPIが変更となりました。 が、多くのプラグインは新APIに対応していません。 あえて新APIにプラグインを書き直す理由もわからないので、スクリプトを組みました。 Error: Declaration of DevTools\DevTools::...