После авторизации Вы получите доступ к файлам, скрытым материалам сайта, исходным кодам
возможность комментировать и т.д.

Вы можете авторизоваться на сайте всего одним кликом:

2016-06-13
Основы PHP → Как ускорить PHP в 6 раз? Внедряем C++ код в PHP
Ускорение PHP, Как ускорить работу сайта, Запуск программы на сервере, Внедрение кода на другом языке в PHP

В крупных проектах бывает, что недостаточно скорости работы одного PHP, сайт грузится слишком долго, страницы открываются медлено, что несомненно вызывает определенный дискомфорт у пользователя. Задача любого сервиса - работать быстро и качественно. И сегодня я расскажу о первом аспекте - о том, как ускорить работу сайта в 6 раз!

Зачем внедрять в PHP код на других языках программирования?

Насколько мне известно, в Яндексе используется язык Python для формирования поисковой выдачи, оно и немудрено, ведь пользователь хочет получать ответ на свой вопрос максимально быстро и Яндекс, как и Google, делает это за доли секунды.

Средствами обычного PHP или PERL невозможно добиться таких высоких скоростей работы, поэтому для выполнения особо сложных задач (таких как формирование поисковой выдачи) необходимо использовать языки более низкого уровня, такие как Python, C++ или даже чистый Си.

Целесообразность: сравнение скоростей работы C++ и PHP на сервере

Давайте напишем одну простую функцию, для сравнения скорости работы C++ и PHP:

#include <iostream>
#include <string>
#include <ctime>

using namespace std;

int main () {
		unsigned int iter = 0;
		unsigned long var = 3;
		
		cin >> iter;
		unsigned int i = 0;
		
			for (; i < iter; i++)
				var += (iter+2) - (iter-2);
				
		cout << "var: "<< var << " Time: " < double(clock()) << endl;
		return 0;
}
Я работаю под Linux, поэтому компилирую эту программу в исполняемый .out - файл, как скомпилировать программу на C++ под Linux я рассказал в этой статье. Если же Вы работаете (Ваш сервер, на котором будет исполняться программа) под Windows, то просто компилируйте в обычный .exe - файл.

Как запустить файл на сервере через PHP?

  1. Для этого в PHP есть как минимум 3 функции: exec(), passthru(), system(). Все они созданы для одной задачи - выполнение консольной команды на сервере. Узнать о особенностях этих функций Вы можете в официальной справке по PHP.
  2. Берем нашу программу на C++, которую написали выше, и добавляем ее на сервер.
  3. Создаем на сервере файл Test.php и пишем в него такой код:
    <?php
    //Функция проверки скорости работы цикла на PHP
        function testing ($n) {
        $start = microtime(true);
    
    		for ($iter = 0; $n < $iter; $n++)
    			$var += ($iter+2) - ($iter-2);
    			
    	$stop = microtime(true) - $start;
    	
    	echo "var".$var." Time: ".$stop."<br>";
        }
    
    //В Linux - разрешаем запускать загруженный файл
    //Без этой строки файл, скорее всего, не запуститься
        system('chmod +x Test.out');
    
    //Запускаем C++ файл, в котором наша программа тестирования
        system('./Test.out <<< 250000000', $error);
        echo "<br>";
        system('./Test.out <<< 700000000', $error);
        
        echo "<br><br>".$error."<br><br>";
        
    //Запускием PHP-функцию тестирования
        testing(250000000);
        testing(700000000);
    ?>
    
  4. Теперь можете сохранить и запустить PHP-страницу и если Вы все сделали верно, то тестирование запустится и вы увидите примерно следующее:
Скорость выполнения измеряется в миллисекундах, поэтому "520000" значит, что скрипт выполнился за 0.52 секунды.

Как видно, в C++ скрипт выполнялнялся 0.52 секунды, а в PHP целых 3 секунды.

Пояснения

  1. Если Ваш сервер работает на Windows используйте команды из консоли Windows (в примере команды для терминала Linux)
  2. Установить права на запуск приложения нужно всего 1 раз, в дальнейшем эту строку можно вообще удалить из программы. Т.е. один раз запустили страницу в браузере - права установились - обновили страницу - можем смело удалять строку.
    system('chmod +x Test.out');
    
    Если же потом Вы обновили файл, то права доступа сбросятся, ведь вы заменили старый фал на новый - необходимо заново запустить эту команду.
  3. Для запуска (выполнения) программы на сервере в Linux используется следующая команда:
    system('./Test.out', $error);
    
    Эта команда просто запускает файл на выполнение и выдает нам содержимое её консольного вывода, то, что мы написали в cout (C++).
  4. Передача аргументов в программу через консоль (терминал) осуществляется с помощью такой конструкции: <<< "Значение". В случае передачи числовых значений кавычки не обязательны.
    system('./Test.out <<< 700000000', $error);
    
    В данном примере мы передаем в нашу программу на C++ значение 700000000 (имитируем консольный ввод)

Возможные ошибки

Обязательно обращайте внимание на значение переменной $error в PHP-скрипте, в случае возникновения ошибок она подскажет вам причину. В данном примере вывод кода ошибки находится здесь:

echo "<br><br>".$error."<br><br>";
  1. 0 - Успешное выполнение, ошибок нет. (Если Вы все же не наблюдаете ожидаемого результата значит, что ошибка в структуре Вашей программы)
  2. 1 - Ошибка выполнения, запуск не выполнен - ищите явную ошибку в коде.
  3. 126 - 127 - Ошибка доступа, вероятно вы не воспользовались командой chmod +x. Либо, если Вы обновляли файл - используйте эту команду еще раз.

2285
2
Пожалуйста, авторизируйтесь, чтобы скачать архив с файлами урока
Evgeny Bukovski
Стояла задача показать, как передать запрос из PHP в другую программу, на любом языке. В начале статьи я написал пример - передача поискового запроса в программу на питоне - его орбработка (питоном) - возвращение ответа в PHP и выдача пользователю.

Вы можете предложить другой вариат реализации такой связи? Если да, то буду Вам очень благодарен! :)
2016-06-16 15:20:23
Сергей Зеленский
Да это же костыль, целесообразнее решать задачу на более подходящем языке, например на том же C++ но без php
2016-06-16 13:32:19