Skip to content

Commit 19cece7

Browse files
authored
Add Kumbia raw with workerman (#5665)
* Add Kumbia raw with workerman * Small change in kumbia raw * Update case smaller prepared statement
1 parent 70f8430 commit 19cece7

File tree

8 files changed

+283
-74
lines changed

8 files changed

+283
-74
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
use Workerman\Protocols\Http;
4+
5+
class KuController extends AppController
6+
{
7+
8+
protected function before_filter()
9+
{
10+
View::select(null, null);
11+
Http::header('Content-Type: application/json');
12+
}
13+
14+
public function index()
15+
{
16+
KuRaw::$db->execute([mt_rand(1, 10000)]);
17+
echo json_encode(KuRaw::$db->fetch());
18+
}
19+
20+
public function query($count = 1)
21+
{
22+
$count = min(max($count, 1), 500);
23+
24+
while ($count--) {
25+
KuRaw::$db->execute([mt_rand(1, 10000)]);
26+
$worlds[] = KuRaw::$db->fetch();
27+
}
28+
echo json_encode($worlds);
29+
}
30+
31+
public function update($count = 1)
32+
{
33+
$count = min(max($count, 1), 500);
34+
35+
while ($count--) {
36+
$id = mt_rand(1, 10000);
37+
38+
KuRaw::$random->execute([$id]);
39+
$row = ['id' => $id, 'randomNumber' => KuRaw::$random->fetchColumn()];
40+
$row['randomNumber'] = mt_rand(1, 10000);
41+
42+
$worlds[] = $row;
43+
}
44+
KuRaw::update($worlds);
45+
46+
echo json_encode($worlds);
47+
}
48+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
class KuFortuneController extends AppController
4+
{
5+
6+
protected function before_filter()
7+
{
8+
View::select(null, 'raw');
9+
}
10+
11+
public function index()
12+
{
13+
KuRaw::$fortune->execute();
14+
$arr = KuRaw::$fortune->fetchAll(PDO::FETCH_KEY_PAIR);
15+
$arr[0] = 'Additional fortune added at request time.';
16+
asort($arr);
17+
18+
$this->data = $arr;
19+
}
20+
}

frameworks/PHP/kumbiaphp/bench/app/controllers/raw_controller.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public function update($count = 1)
4545

4646
$sth->execute([$id]);
4747
$row = ['id' => $id, 'randomNumber' => $sth->fetchColumn()];
48-
$row['randomNumber'] = mt_rand(1, 10000);
4948
$updateStatement->execute(
5049
[$row['randomNumber'] = mt_rand(1, 10000), $id]
5150
);
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
3+
class KuRaw
4+
{
5+
private static PDO $instance;
6+
public static PDOStatement $db;
7+
public static PDOStatement $fortune;
8+
public static PDOStatement $random;
9+
/**
10+
* @var []PDOStatement
11+
*/
12+
private static $update;
13+
14+
public static function init()
15+
{
16+
$pdo = new PDO(
17+
'pgsql:host=tfb-database;dbname=hello_world',
18+
'benchmarkdbuser',
19+
'benchmarkdbpass',
20+
[
21+
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
22+
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
23+
PDO::ATTR_EMULATE_PREPARES => false
24+
]
25+
);
26+
27+
self::$db = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
28+
self::$fortune = $pdo->prepare('SELECT id,message FROM Fortune');
29+
self::$random = $pdo->prepare('SELECT randomNumber FROM World WHERE id = ?');
30+
self::$instance = $pdo;
31+
}
32+
33+
/**
34+
* Postgres bulk update
35+
*
36+
* @param array $worlds
37+
* @return void
38+
*/
39+
public static function update(array $worlds)
40+
{
41+
$rows = count($worlds);
42+
43+
if (!isset(self::$update[$rows])) {
44+
$sql = 'UPDATE world SET randomNumber = CASE id'
45+
. str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows) .
46+
'END WHERE id IN ('
47+
. implode(', ', array_fill(0, $rows, '?::INTEGER')) . ')';
48+
49+
self::$update[$rows] = self::$instance->prepare($sql);
50+
}
51+
52+
$val = [];
53+
$keys = [];
54+
foreach ($worlds as $world) {
55+
$val[] = $keys[] = $world['id'];
56+
$val[] = $world['randomNumber'];
57+
}
58+
59+
self::$update[$rows]->execute([...$val, ...$keys]);
60+
}
61+
62+
/**
63+
* Alternative bulk update in Postgres
64+
*
65+
* @param array $worlds
66+
* @return void
67+
*/
68+
public static function update2(array $worlds)
69+
{
70+
$rows = count($worlds);
71+
72+
if (!isset(self::$update[$rows])) {
73+
$sql = 'UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES '
74+
. implode(', ', array_fill(0, $rows, '(?::INTEGER, ?::INTEGER)')) .
75+
' ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id';
76+
77+
self::$update[$rows] = self::$instance->prepare($sql);
78+
}
79+
80+
$val = [];
81+
foreach ($worlds as $world) {
82+
$val[] = $world['id'];
83+
$val[] = $world['randomNumber'];
84+
//$update->bindParam(++$i, $world['id'], PDO::PARAM_INT);
85+
}
86+
87+
self::$update[$rows]->execute($val);
88+
}
89+
}
Lines changed: 94 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,95 @@
11
{
2-
"framework": "kumbiaphp",
3-
"tests": [{
4-
"default": {
5-
"plaintext_url": "/",
6-
"json_url": "/json",
7-
"db_url": "/db",
8-
"query_url": "/db/query/",
9-
"fortune_url": "/fortune",
10-
"update_url": "/db/update/",
11-
"port": 8080,
12-
"approach": "Realistic",
13-
"classification": "Fullstack",
14-
"database": "MySQL",
15-
"framework": "KumbiaPHP",
16-
"language": "PHP",
17-
"flavor": "PHP7",
18-
"orm": "micro",
19-
"platform": "FPM/FastCGI",
20-
"webserver": "nginx",
21-
"os": "Linux",
22-
"database_os": "Linux",
23-
"display_name": "kumbiaphp",
24-
"notes": "",
25-
"versus": "php"
26-
},
27-
"raw": {
28-
"db_url": "/raw",
29-
"query_url": "/raw/query/",
30-
"fortune_url": "/raw-fortune",
31-
"update_url": "/raw/update/",
32-
"port": 8080,
33-
"approach": "Realistic",
34-
"classification": "Fullstack",
35-
"database": "MySQL",
36-
"framework": "KumbiaPHP",
37-
"language": "PHP",
38-
"flavor": "PHP7",
39-
"orm": "Raw",
40-
"platform": "FPM/FastCGI",
41-
"webserver": "nginx",
42-
"os": "Linux",
43-
"database_os": "Linux",
44-
"display_name": "kumbiaphp-raw",
45-
"notes": "",
46-
"versus": "php"
47-
},
48-
"workerman-mysql": {
49-
"plaintext_url": "/",
50-
"json_url": "/json",
51-
"db_url": "/db",
52-
"query_url": "/db/query/",
53-
"fortune_url": "/fortune",
54-
"update_url": "/db/update/",
55-
"port": 8080,
56-
"approach": "Realistic",
57-
"classification": "Fullstack",
58-
"database": "MySQL",
59-
"framework": "KumbiaPHP",
60-
"language": "PHP",
61-
"flavor": "PHP7",
62-
"orm": "micro",
63-
"platform": "workerman",
64-
"webserver": "None",
65-
"os": "Linux",
66-
"database_os": "Linux",
67-
"display_name": "kumbiaphp-worker",
68-
"notes": "",
69-
"versus": "workerman"
70-
}
71-
}]
72-
}
2+
"framework": "kumbiaphp",
3+
"tests": [
4+
{
5+
"default": {
6+
"plaintext_url": "/",
7+
"json_url": "/json",
8+
"db_url": "/db",
9+
"query_url": "/db/query/",
10+
"fortune_url": "/fortune",
11+
"update_url": "/db/update/",
12+
"port": 8080,
13+
"approach": "Realistic",
14+
"classification": "Fullstack",
15+
"database": "MySQL",
16+
"framework": "KumbiaPHP",
17+
"language": "PHP",
18+
"flavor": "PHP7",
19+
"orm": "micro",
20+
"platform": "FPM/FastCGI",
21+
"webserver": "nginx",
22+
"os": "Linux",
23+
"database_os": "Linux",
24+
"display_name": "kumbiaphp",
25+
"notes": "",
26+
"versus": "php"
27+
},
28+
"raw": {
29+
"db_url": "/raw",
30+
"query_url": "/raw/query/",
31+
"fortune_url": "/raw-fortune",
32+
"update_url": "/raw/update/",
33+
"port": 8080,
34+
"approach": "Realistic",
35+
"classification": "Fullstack",
36+
"database": "MySQL",
37+
"framework": "KumbiaPHP",
38+
"language": "PHP",
39+
"flavor": "PHP7",
40+
"orm": "Raw",
41+
"platform": "FPM/FastCGI",
42+
"webserver": "nginx",
43+
"os": "Linux",
44+
"database_os": "Linux",
45+
"display_name": "kumbiaphp-raw",
46+
"notes": "",
47+
"versus": "php"
48+
},
49+
"workerman": {
50+
"plaintext_url": "/",
51+
"json_url": "/json",
52+
"db_url": "/ku",
53+
"query_url": "/ku/query/",
54+
"update_url": "/ku/update/",
55+
"fortune_url": "/ku-fortune",
56+
"port": 8080,
57+
"approach": "Realistic",
58+
"classification": "Fullstack",
59+
"database": "Postgres",
60+
"framework": "KumbiaPHP",
61+
"language": "PHP",
62+
"flavor": "PHP7",
63+
"orm": "raw",
64+
"platform": "workerman",
65+
"webserver": "None",
66+
"os": "Linux",
67+
"database_os": "Linux",
68+
"display_name": "kumbiaphp-worker",
69+
"notes": "",
70+
"versus": "workerman"
71+
},
72+
"workerman-mysql": {
73+
"db_url": "/db",
74+
"query_url": "/db/query/",
75+
"fortune_url": "/fortune",
76+
"update_url": "/db/update/",
77+
"port": 8080,
78+
"approach": "Realistic",
79+
"classification": "Fullstack",
80+
"database": "MySQL",
81+
"framework": "KumbiaPHP",
82+
"language": "PHP",
83+
"flavor": "PHP7",
84+
"orm": "micro",
85+
"platform": "workerman",
86+
"webserver": "None",
87+
"os": "Linux",
88+
"database_os": "Linux",
89+
"display_name": "kumbiaphp-worker",
90+
"notes": "",
91+
"versus": "workerman"
92+
}
93+
}
94+
]
95+
}

frameworks/PHP/kumbiaphp/deploy/conf/cliphp.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ opcache.interned_strings_buffer=16
88
opcache.huge_code_pages=1
99

1010
mysqlnd.collect_statistics = Off
11-
memory_limit = 768M
11+
memory_limit = 512M
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
FROM ubuntu:19.10
2+
3+
ARG DEBIAN_FRONTEND=noninteractive
4+
5+
RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
6+
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
7+
RUN apt-get update -yqq > /dev/null && \
8+
apt-get install -yqq git unzip php7.4 php7.4-common php7.4-cli php7.4-pgsql > /dev/null
9+
10+
RUN apt-get install -yqq composer > /dev/null
11+
12+
RUN apt-get install -y php-pear php-dev libevent-dev > /dev/null
13+
RUN printf "\n\n /usr/lib/x86_64-linux-gnu/\n\n\nno\n\n\n" | pecl install event > /dev/null && echo "extension=event.so" > /etc/php/7.4/cli/conf.d/event.ini
14+
15+
COPY deploy/conf/cliphp.ini /etc/php/7.4/cli/php.ini
16+
17+
ADD ./ /kumbiaphp
18+
WORKDIR /kumbiaphp
19+
20+
RUN git clone -b dev --single-branch --depth 1 https://github.com/KumbiaPHP/KumbiaPHP.git vendor/Kumbia
21+
22+
#RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/{index,json}_controller.php
23+
RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/index_controller.php
24+
RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/json_controller.php
25+
RUN sed -i "s|//KuRaw::init(|KuRaw::init(|g" server.php
26+
27+
RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
28+
29+
CMD php server.php start

frameworks/PHP/kumbiaphp/server.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
2-
require_once __DIR__.'/bench/app/workerbootstrap.php';
32
require_once __DIR__.'/vendor/autoload.php';
3+
require_once __DIR__.'/bench/app/workerbootstrap.php';
44

55
use Workerman\Worker;
66

@@ -9,6 +9,7 @@
99
$http_worker->onWorkerStart = static function () {
1010

1111
kumbiaInit();
12+
//KuRaw::init();
1213
};
1314

1415
$http_worker->onMessage = static function ($connection) {

0 commit comments

Comments
 (0)