Количество обращений к базе данных WordPress

Чтобы узнать количество обращений к базе данных вашим сайтом на WordPress, нужно в файл темы footer.php перед тегом добавить следующий код.

<!--?php echo get_num_queries(); ?--> queries in <!--?php timer_stop(1); ?-->

Так же вы узнаете время затраченное на обработку всех обращений к БД.

Скорость генерации страницы PHP

Чтобы измерить скорость генерации страницы в php, в начале скрипта следует вставить следующий код:

// Засекаем время старта генерации страницы
$start_array = explode(" ",microtime());$start_time = $start_array[1] + $start_array[0];

А в конце скрипта пишем это:

// Вычисляем скорость генерации страницы
$end_array = explode(" ",microtime());$time = $end_array[1] + $end_array[0] - $start_time;
printf("Generated in %f sec.",$time);

Почему именно в скрипте?
Чтобы минимизировать время на расчеты генерации страницы в php, лучше вставлять код в главном скрипте, чтобы минимизировать обращения к жесткому диску, и тем самым снизить потери времени.

Установка nginx, php, mysql(mariadb) на Ubuntu

– Будьте любезны, в каком направлении мне идти?
– В известном тебе, – ответил Кот.
– Оно мне неизвестно.
– Значит, в неизвестном. Во всяком случае, известно, что в известное время ты окажешься та-ам или ту-ут, – мурлыкнул Кот.

Установка nginx:

apt update
apt install nginx

Установка PHP и драйвера MariaDB

apt install php-fpm php-mysqlnd php-xml

Создание виртуальных доменов

mkdir /var/www/domain.com
chmod -R 755 /var/www/domain.com

В директории /etc/nginx/sites-available создаем файл domain.com.conf

Содержимое файла domain.com.conf

server {
     listen 80;
     server_name domain.com;

     root /var/www/domain.com;

     # Add index.php to the list if you are using PHP
     index index.php index.html index.htm index.nginx-debian.html;
 
     server_name domain.com;
 
    location / {
               try_files $uri $uri/ =404;
               if (!-e $request_filename) {
                  rewrite ^.+/?(/wp-.*) $1 last;
            rewrite ^.+/?(/.*\.php)$ $1 last;
                  rewrite ^(.+)$ /index.php?q=$1 last;
      }
}

location ~ \.php$ {
               include snippets/fastcgi-php.conf;
               fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
       }
}

Теперь нужно перезагрузить web сервер

service nginx restart

Проверка работы php

В папке /var/www/domain.com , создадим файл index.php и напишем в нем:

<?php phpinfo(); ?>

Далее, открываем в браузере свой сайт, в примере мы используем domain.com и если всё сделано правильно, то видим такую картину:

Устанавливаем mariadb

sudo apt install mariadb-server mariadb-client

Настройки безопасности

mysql_secure_installation

Отвечаем на вопросы:

Создаем базу данных и пользователя.

Входим в mariadb:

mysql -u root

Если вы установили пароль на root:

mysql -u root -p
CREATE DATABASE domaindb;
CREATE USER 'nameus'@'localhost' IDENTIFIED BY 'user_password';

За место user_password введите пароль пользователя.

GRANT ALL ON domaindb.* TO [email protected];
quit;

Развертывание WordPress

cd /var/www/domain.com
curl -O https://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz
mv wordpress/* .
rmdir wordpress
chown -R www-data:www-data /var/www/domain.com
chmod -R 755 /var/www/domain.com

Перехватить вывод require в php, или выполнить php в file_get_contents

… Значит, вводим план-перехват. Только сразу подготовь рапорт, что план-перехват никаких результатов не дал.
The Lord of the Rings: The Two Towers

Для того, чтобы подгрузить содержимое файла и вывести его в определенном месте веб страницы, можно использовать file_get_contents, но если в составе загруженного таким образом файла будет содержаться php код, он не обработается.
Чтобы php-код выполнился в динамически загружаемом файле, можно воспользоваться командой require, но она выводит результат мгновенно, а если мы предварительно формируем вывод в переменную, то такой способ тоже не подходит… Или подходит?

В php Есть набор команд для буферизации вывода, чтобы включить буфер вывода, воспользуемся командой ob_start(). После этого, вызываем require и забираем результат в переменную командой ob_get_clean();

function GetPHP($file_name){
    ob_start();
    require( $file_name );
    return ob_get_clean();
}

Здесь представлена функция, которая возвращает результат выполнения php скрипта в переменную:

echo GetPHP('some-file.php');

Развертывание nginx+php на сервере ubuntu

NGinx – это шустрый и легкий web-сервер, для его установки необходимо ввести несколько команд в терминал:

sudo apt update
sudo apt install nginx php-fpm

Проверяем работоспособность web-сервера:

systemctl status nginx

При этом меняем файл /etc/nginx/sites-available/default

server {
	listen 80 default_server;
	listen [::]:80 default_server;

	root /var/www/html;

	index index.html index.htm index.php;

	server_name _;

	location / {
		try_files $uri $uri/ =404;
	}

	location ~ \.php$ {
		try_files $uri = 404;
		include /etc/nginx/fastcgi.conf;
		fastcgi_pass unix:/run/php/php7.0-fpm.sock;
	}
}

Далее, перезагружаем nginx

nginx -s reload

 

AJAX PHP JQUERY передача POST запроса

Для того, чтобы отправить POST запрос на PHP скрипт посредством AJAX JQUERY, создадим 2 файла:

jqtest.htm – в котором будет форма запроса и javascript код для формирования и отправки запроса;

jqtest.php – для приёма и отсылки ответа.

Листинг файла jqtest.htm:

<div>
<label for="request">Request:  </label>
<input id="request">
<input type="submit" value="Send" onclick="send();">
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
  function send()
  {
    jQuery.ajax({
      dataType: "json",
      method: "POST",
      url: "jqtest.php",
      data: { msg: jQuery('#request').val()}
    }).done(function( msg ) {
      alert(msg['answer']);
    });
  }
</script>

Листинг файла jqtest.php:

<?php
$q = ($_POST['msg']);
$ans= array(
  'answer' => 'You send: '.$q,
);
echo json_encode($ans);
?>

JQUERY запрос передаёт ключ msg в формате JSON, а PHP код формирует JSON ответ и возвращает его в ключе answer.


Листинг index.php из видео:


<?php
if(!$_POST["message"]){
// Форма ввода
?>
<!DOCTYPE html>
<html>
<head>
<title>Отправка сообщений - jQuery</title>
<script src="//code.jquery.com/jquery-1.8.3.js"></script>
</head>
<body>

<form onsubmit="Send();return false">
<label for="request">Запрос:</label>
<input id="request" required>
<input type="submit" value="Send">
</form>
<div id="result"></div>

<script>
function Send(){
jQuery.ajax({
dataType: "json",
type: "POST",
url:"//inc1.net/vlog/jquery-test/",
data: {message: jQuery('#request').val()}
}).done(function(msg){
jQuery('#result').text(msg['answer']);
})
}
</script>

</body>
</html>
<?php }else{
// Обработка запроса
$q = $_POST['message'];
$answer = array(
'answer' => 'Принят запрос: '.$q
);
echo json_encode($answer);
}
?>

Cross-Origin Read Blocking (CORB) – решено

Каждого … можно выслушать, но не с каждым стоит разговаривать.
Артур Шопенгауэр

При попытке отправить jQuery JSON запрос с другого домена, появляется ошибка:

Access to XMLHttpRequest at ‘http://*’ from origin ‘http://*’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

jquery.js?ver=*:4 Cross-Origin Read Blocking (CORB) blocked cross-origin response * with MIME type application/json. See https://www.chromestatus.com/feature/5629709824032768 for more details. 

Это означает, что совместное использование ресурсов между разными источниками(CORS) запрещено.

Для того, чтобы разрешить CORS, необходимо в начале php скрипта, который обрабатывает запрос, добавить генерацию заголовков ответа сервера, указывающих на то, что CORS разрешён.

<?php
switch ($_SERVER['HTTP_ORIGIN']) {
case 'http://remote.domain': case 'https://remote.domain':
header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
break;
}
?>
  • http://remote.domain – url сайта, с которого может происходить запрос.

На стороне клиента, нужно указать crossDomain: true

<script>
jQuery.ajax({
  crossDomain: true,
  dataType: "json",
  method: "POST",
  url: "http://main.domain/script.php",
  data: { key: "some text" }
  }).done(function( msg ) {
  // answer
});
</script>

Итак, чтобы передать запрос с одного сайта, на другой, нужно на принимающем сайте, указать серверные заголовки, разрешающие запросы с определенного удалённого домена. А на удаленном сайте, прописать ключ, указывающий на то, что этот запрос будет работать между разными доменами.