2017-01-02 2 views
1

Добрый день,Как увеличить скорость функции PHP, которая возвращает маркер

Там в файл с именем «BFILE», который имеет двоичные значения, как это:

7f45 4c46 0201 0103 0000 0000 0000 0000 
0200 3e00 0100 0000 300c 4000 0000 0000 
4000 0000 0000 0000 5062 0c00 0000 0000 
0000 0000 4000 3800 0500 4000 1f00 1c00 
0100 0000 0500 0000 0000 0000 0000 0000 

Размер файла является 814KB. Мы не можем каким-либо образом изменить двоичный файл.

Функция, доступ к этому, как это:

function get_auth_token() { 
    $arg = json_encode($_REQUEST); 
    return `./bfile $arg`; 
} 

на основе функции, что возвращается маркер, как это «z6x6ti5taac1mjn-9wG7w44-», но я не знаю, как это работает и как я могу увеличить скорость.

С моим текущего теста, результат таков:

Server Software:  Apache/2.4.7 
Server Hostname:  127.0.0.1 
Server Port:   8000 

Document Length:  38 bytes 

Concurrency Level:  10 
Time taken for tests: 201.117 seconds 
Complete requests:  1000 
Failed requests:  0 
Total transferred:  226000 bytes 
HTML transferred:  38000 bytes 
Requests per second: 4.97 [#/sec] (mean) 
Time per request:  2011.172 [ms] (mean) 
Time per request:  201.117 [ms] (mean, across all concurrent requests) 
Transfer rate:   1.10 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing:  5 1995 1434.6 2010 4055 
Waiting:  4 1994 1434.5 2009 4054 
Total:   5 1995 1434.6 2010 4055 

Percentage of the requests served within a certain time (ms) 
    50% 2010 
    66% 3009 
    75% 3012 
    80% 4006 
    90% 4010 
    95% 4013 
    98% 4018 
    99% 4022 
100% 4055 (longest request) 

За тысячу запроса потребовалось 201 секунд, чтобы закончить. Мне нужно улучшить дизайн, чтобы он обрабатывал несколько тысяч запросов в секунду. Я не знаю, как это сделать. Пожалуйста помоги. Спасибо!

+1

Похоже, что этот файл является двоичным блобом, исполняемым чем-то, что делает внутреннее вуду, которое вы не можете понять или изменить. В этом случае ответ ясно: «вы ничего не можете сделать». Закрытые двоичные blob-файлы - ужасная вещь. Возможно, эта штука даже помещает все ваши данные пользователя в какую-то злую компанию. Ты не знаешь. – arkascha

+0

Файл с 814 КБ содержит не только код, указанный в вашем вопросе (гораздо больше). Как сказал @Arkascha, кто знает, что находится в файле. Можете ли вы разместить дополнительную информацию об этом файле? Возможно, вы можете использовать простой код чтения с php, чтобы получить только те данные, которые вам действительно нужны, а не обрабатывать остальные. Это может быть лучшим подходом. –

+2

Является ли выход этого blob воспроизводимым? Так выводит ли она одну и ту же строку для идентичного ввода каждый раз вызываемый? Если это так, вы можете создать себе словарь внутри базы данных, который вы заполняете всеми возможными комбинациями ввода/вывода. Доступ к этому будет в миллионы раз быстрее. – arkascha

ответ

1

Если все еще имеет смысл, можно было бы сделать что-то, что вы могли бы сделать, чтобы увеличить объем запроса, который вы можете обрабатывать: используйте php fpm, проще настроить с помощью nginx, чтобы иметь возможность звонить fastcgi_finish_request(), как только вы получите запрос и возвратил статус ответа. Таким образом, остальная часть скрипта будет выполнена в фоновом режиме без сохранения слота подключения. Это должно увеличить вашу частоту запросов, но этого может быть недостаточно. Если это так, вам нужно будет масштабировать горизонтально путем балансировки нагрузки конечной точки целевого API на нескольких серверах и, вероятно, использовать шаблон очереди/рабочего, если то, что вам нужно сделать, связано с загрузкой некоторых данных на некоторое репо, которое также может быть перегружено когда он слишком высок.

Все это также достижимо с apache и без fpm, но это немного сложнее, поскольку вам нужно установить каждый бит ответа, чтобы на самом деле освободить соединение искусственно.

Смежные вопросы