Skip to content

Commit 394e1e5

Browse files
committed
Add two tests and some update to Worker class
1 parent 38aa617 commit 394e1e5

12 files changed

Lines changed: 328 additions & 222 deletions

bin/example_file_downloading

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,25 @@
11
#!/usr/bin/env php
22
<?php
3+
4+
use wapmorgan\Threadable\DownloadWorker;
35
use wapmorgan\Threadable\Worker;
46
use wapmorgan\Threadable\WorkersPool;
57
require_once __DIR__.'/../vendor/autoload.php';
68

7-
class DownloadWorker extends Worker
8-
{
9-
public function onPayload(array $data)
10-
{
11-
echo 'Started '.$data[0].' into '.$data[2].PHP_EOL;
12-
copy($data[0], $data[2]);
13-
}
14-
}
15-
16-
function remote_filesize($path)
17-
{
18-
$fp = fopen($path, 'r');
19-
$inf = stream_get_meta_data($fp);
20-
fclose($fp);
21-
22-
foreach($inf["wrapper_data"] as $v) {
23-
if (stristr($v,"content-length")) {
24-
$v = explode(":",$v);
25-
return (int)trim($v[1]);
26-
}
27-
}
28-
}
29-
309
function show_status(&$files)
3110
{
3211
foreach ($files as $i => $file) {
33-
if (file_exists($file[2])) {
34-
clearstatcache(true, $file[2]);
35-
$downloaded_size = filesize($file[2]);
36-
if ($downloaded_size == $file[1]) {
37-
echo $file[0].' downloaded'.PHP_EOL;
12+
if (file_exists($file['target'])) {
13+
clearstatcache(true, $file['target']);
14+
$downloaded_size = filesize($file['target']);
15+
if ($downloaded_size == $file['size']) {
16+
echo $file['source'].' downloaded'.PHP_EOL;
3817
unset($files[$i]);
39-
unlink($file[2]);
18+
unlink($file['target']);
4019
} else if ($downloaded_size === 0) {
4120
// echo $file[0].' in queue'.PHP_EOL;
4221
} else {
43-
echo $file[0].' downloading '.round($downloaded_size * 100 / $file[1], 2).'%'.PHP_EOL;
22+
echo $file['source'].' downloading '.round($downloaded_size * 100 / $file['size'], 2).'%'.PHP_EOL;
4423
}
4524
}
4625
}
@@ -49,16 +28,20 @@ function show_status(&$files)
4928
$file_sources = ['https://yandex.ru/images/today?size=1920x1080', 'http://hosting-obzo-ru.1gb.ru/hosting-obzor.ru.zip'];
5029
$files = [];
5130
foreach ($file_sources as $file_to_download) {
52-
$file_size = remote_filesize($file_to_download);
31+
$file_size = DownloadWorker::getRemoteFileSize($file_to_download);
5332
$output = tempnam(sys_get_temp_dir(), 'thrd_test');
54-
$files[] = [$file_to_download, $file_size, $output];
33+
$files[] = [
34+
'source' => $file_to_download,
35+
'size' => $file_size,
36+
'target' => $output,
37+
];
5538
}
5639

5740
$worker = new DownloadWorker();
5841
$worker->start();
5942
foreach ($files as $file) {
60-
echo 'Enqueuing '.$file[0].' with size '.$file[1].PHP_EOL;
61-
$worker->sendPayload([$file]);
43+
echo 'Enqueuing '.$file['source'].' with size '.$file['size'].PHP_EOL;
44+
$worker->sendPayload($file);
6245
}
6346

6447
while ($worker->state !== Worker::TERMINATED) {

bin/example_file_downloading_pool

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,25 @@
11
#!/usr/bin/env php
22
<?php
3+
4+
use wapmorgan\Threadable\DownloadWorker;
35
use wapmorgan\Threadable\Worker;
46
use wapmorgan\Threadable\WorkersPool;
57
require_once __DIR__.'/../vendor/autoload.php';
68

7-
class DownloadWorker extends Worker
8-
{
9-
public function onPayload(array $data)
10-
{
11-
echo 'Started '.$data[0].' into '.$data[2].PHP_EOL;
12-
copy($data[0], $data[2]);
13-
}
14-
}
15-
16-
function remote_filesize($path)
17-
{
18-
$fp = fopen($path, 'r');
19-
$inf = stream_get_meta_data($fp);
20-
fclose($fp);
21-
22-
foreach($inf["wrapper_data"] as $v) {
23-
if (stristr($v,"content-length")) {
24-
$v = explode(":",$v);
25-
return (int)trim($v[1]);
26-
}
27-
}
28-
}
29-
309
function show_status(&$files)
3110
{
3211
foreach ($files as $i => $file) {
33-
if (file_exists($file[2])) {
34-
clearstatcache(true, $file[2]);
35-
$downloaded_size = filesize($file[2]);
36-
if ($downloaded_size == $file[1]) {
37-
echo $file[0].' downloaded'.PHP_EOL;
12+
if (file_exists($file['target'])) {
13+
clearstatcache(true, $file['target']);
14+
$downloaded_size = filesize($file['target']);
15+
if ($downloaded_size == $file['size']) {
16+
echo $file['source'].' downloaded'.PHP_EOL;
3817
unset($files[$i]);
39-
unlink($file[2]);
18+
unlink($file['target']);
4019
} else if ($downloaded_size === 0) {
4120
// echo $file[0].' in queue'.PHP_EOL;
4221
} else {
43-
echo $file[0].' downloading '.round($downloaded_size * 100 / $file[1], 2).'%'.PHP_EOL;
22+
echo $file['source'].' downloading '.round($downloaded_size * 100 / $file['size'], 2).'%'.PHP_EOL;
4423
}
4524
}
4625
}
@@ -49,16 +28,20 @@ function show_status(&$files)
4928
$file_sources = [/*'https://yandex.ru/images/today?size=1920x1080', */'http://hosting-obzo-ru.1gb.ru/hosting-obzor.ru.zip', 'http://soft.eurodir.ru/test-speed-100Mb.bin'];
5029
$files = [];
5130
foreach ($file_sources as $file_to_download) {
52-
$file_size = remote_filesize($file_to_download);
31+
$file_size = DownloadWorker::getRemoteFileSize($file_to_download);
5332
$output = tempnam(sys_get_temp_dir(), 'thrd_test');
54-
$files[] = [$file_to_download, $file_size, $output];
33+
$files[] = [
34+
'source' => $file_to_download,
35+
'size' => $file_size,
36+
'target' => $output,
37+
];
5538
}
5639

57-
$pool = new WorkersPool('DownloadWorker');
40+
$pool = new WorkersPool('wapmorgan\Threadable\DownloadWorker');
5841
$pool->setPoolSize(3);
5942
foreach ($files as $file) {
60-
echo 'Enqueuing '.$file[0].' with size '.$file[1].PHP_EOL;
61-
$pool->sendData([$file]);
43+
echo 'Enqueuing '.$file['source'].' with size '.$file['size'].PHP_EOL;
44+
$pool->sendData($file);
6245
}
6346

6447
$pool->waitToFinish([

bin/example_file_downloading_predefined

Lines changed: 0 additions & 70 deletions
This file was deleted.

bin/example_file_downloading_smaller

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,25 @@
11
#!/usr/bin/env php
22
<?php
3+
4+
use wapmorgan\Threadable\DownloadWorker;
35
use wapmorgan\Threadable\Worker;
46
use wapmorgan\Threadable\WorkersPool;
57
require_once __DIR__.'/../vendor/autoload.php';
68

7-
class DownloadWorker extends Worker
8-
{
9-
public function onPayload(array $data)
10-
{
11-
echo 'Started '.$data[0].' into '.$data[2].PHP_EOL;
12-
copy($data[0], $data[2]);
13-
}
14-
}
15-
16-
function remote_filesize($path)
17-
{
18-
$fp = fopen($path, 'r');
19-
$inf = stream_get_meta_data($fp);
20-
fclose($fp);
21-
22-
foreach($inf["wrapper_data"] as $v) {
23-
if (stristr($v,"content-length")) {
24-
$v = explode(":",$v);
25-
return (int)trim($v[1]);
26-
}
27-
}
28-
}
29-
309
function show_status(&$files)
3110
{
3211
foreach ($files as $i => $file) {
33-
if (file_exists($file[2])) {
34-
clearstatcache(true, $file[2]);
35-
$downloaded_size = filesize($file[2]);
36-
if ($downloaded_size == $file[1]) {
37-
echo $file[0].' downloaded'.PHP_EOL;
12+
if (file_exists($file['target'])) {
13+
clearstatcache(true, $file['target']);
14+
$downloaded_size = filesize($file['target']);
15+
if ($downloaded_size == $file['size']) {
16+
echo $file['source'].' downloaded'.PHP_EOL;
3817
unset($files[$i]);
39-
unlink($file[2]);
18+
unlink($file['target']);
4019
} else if ($downloaded_size === 0) {
4120
// echo $file[0].' in queue'.PHP_EOL;
4221
} else {
43-
echo $file[0].' downloading '.round($downloaded_size * 100 / $file[1], 2).'%'.PHP_EOL;
22+
echo $file['source'].' downloading '.round($downloaded_size * 100 / $file['size'], 2).'%'.PHP_EOL;
4423
}
4524
}
4625
}
@@ -49,16 +28,20 @@ function show_status(&$files)
4928
$file_sources = ['https://yandex.ru/images/today?size=1920x1080', 'http://hosting-obzo-ru.1gb.ru/hosting-obzor.ru.zip'];
5029
$files = [];
5130
foreach ($file_sources as $file_to_download) {
52-
$file_size = remote_filesize($file_to_download);
31+
$file_size = DownloadWorker::getRemoteFileSize($file_to_download);
5332
$output = tempnam(sys_get_temp_dir(), 'thrd_test');
54-
$files[] = [$file_to_download, $file_size, $output];
33+
$files[] = [
34+
'source' => $file_to_download,
35+
'size' => $file_size,
36+
'target' => $output,
37+
];
5538
}
5639

5740
$worker = new DownloadWorker();
5841
$worker->start();
5942
foreach ($files as $file) {
60-
echo 'Enqueuing '.$file[0].' with size '.$file[1].PHP_EOL;
61-
$worker->sendPayload([$file]);
43+
echo 'Enqueuing '.$file['source'].' with size '.$file['target'].PHP_EOL;
44+
$worker->sendPayload($file);
6245
}
6346

6447
while ($worker->state == Worker::RUNNING) {

bin/test_highload

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,7 @@ require_once __DIR__.'/../vendor/autoload.php';
77
pcntl_signal(SIGUSR1, function () {});
88
pcntl_signal(SIGUSR2, function () {});
99

10-
class CpuEatingWorker extends Worker
11-
{
12-
public function onPayload(array $abc)
13-
{
14-
echo 'new iteration'.PHP_EOL;
15-
$till = microtime(true) + 5;
16-
while (microtime(true) < $till) {
1710

18-
}
19-
}
20-
}
2111

2212
function waitUntilFinish(Worker $worker)
2313
{

bin/test_pool_object

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ class ObjectWorker extends Worker
1111
public function __construct()
1212
{
1313
parent::__construct();
14-
$this->signature = rand(1, 10000);
14+
$this->regenerate();
15+
}
16+
17+
public function __clone()
18+
{
19+
$this->regenerate();
1520
}
1621

1722
public function onPayload(array $payload)
@@ -21,6 +26,11 @@ class ObjectWorker extends Worker
2126
echo 'signature: '.$this->signature.PHP_EOL;
2227
sleep($time);
2328
}
29+
30+
private function regenerate()
31+
{
32+
$this->signature = rand(1, 10000);
33+
}
2434
}
2535

2636
$pool = new WorkersPool(new ObjectWorker());

src/DownloadWorker.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,37 @@
1111
*/
1212
class DownloadWorker extends Worker
1313
{
14-
public function onPayload($data)
14+
/**
15+
* @param array $data
16+
* @return bool
17+
* @throws Exception
18+
*/
19+
public function onPayload(array $data)
1520
{
1621
if (empty($data['source']) || empty($data['target']))
17-
throw new Exception();
22+
throw new Exception('Payload should contain two elements: `source` - file URL, `target` - place to save.');
23+
1824
return copy($data['source'], $data['target']);
1925
}
26+
27+
/**
28+
* @param $path
29+
* @return int
30+
* @throws Exception
31+
*/
32+
static public function getRemoteFileSize($path)
33+
{
34+
$fp = fopen($path, 'r');
35+
$inf = stream_get_meta_data($fp);
36+
fclose($fp);
37+
38+
foreach($inf['wrapper_data'] as $v) {
39+
if (stristr($v,'content-length')) {
40+
$v = explode(":",$v);
41+
return (int)trim($v[1]);
42+
}
43+
}
44+
45+
throw new Exception('Can not determine size of remote file');
46+
}
2047
}

0 commit comments

Comments
 (0)