Протокол IndexNow набирает популярность для ускоренной индексации и удаления устаревшего контента из поисковых систем. Если вы разрабатываете сайты и приложения на PHP, интеграция IndexNow выходит за рамки WordPress и может быть полезна в различных фреймворках. В этой статье разберем, как реализовать отправку URL в IndexNow на примере популярных PHP-фреймворков: Laravel, Symfony и Yii2. Также рассмотрим преимущества и подводные камни каждой реализации.
Что такое IndexNow и зачем его интегрировать в PHP-приложения
IndexNow — это протокол, разработанный Microsoft и Яндекс, позволяющий быстро уведомлять поисковые системы об изменениях на сайте. Благодаря этому поисковики могут оперативно обновлять индекс, что положительно сказывается на SEO и пользовательском опыте.
Для сайтов на PHP интеграция IndexNow означает автоматическую отправку URL при создании, обновлении или удалении контента. Это особенно важно для крупных проектов с динамическим контентом, где традиционная индексация может занимать много времени.
Ключевые моменты реализации IndexNow в PHP-фреймворках
- Автоматическая отправка URL при изменениях в базе данных.
- Обработка ошибок и повторные попытки отправки.
- Учет ограничений API: максимальное количество URL за запрос и частота отправок.
- Хранение и безопасное использование ключа API (ключа IndexNow).
- Логирование и мониторинг отправок для отладки.
Интеграция IndexNow в Laravel
Laravel — популярный PHP-фреймворк с мощными возможностями для построения REST API и фоновых задач. Для интеграции IndexNow лучше всего использовать события и очереди:
1. Создание сервиса отправки IndexNow
namespace App\Services;
use Illuminate\Support\Facades\Http;
class IndexNowService
{
protected $apiKey;
protected $apiUrl = 'https://api.indexnow.org/indexnow';
public function __construct()
{
$this->apiKey = config('services.indexnow.key');
}
public function sendUrl(string $url): bool
{
$payload = [
'host' => parse_url($url, PHP_URL_HOST),
'key' => $this->apiKey,
'keyLocation' => url('/'. $this->apiKey . '.txt'),
'urlList' => [$url],
];
$response = Http::post($this->apiUrl, $payload);
return $response->successful();
}
}
2. Использование события для отправки URL
Добавим событие, которое будет срабатывать при сохранении модели, например, статьи:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Models\Article;
use App\Services\IndexNowService;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Article::saved(function ($article) {
app(IndexNowService::class)->sendUrl(route('article.show', $article));
});
}
}
3. Настройка ключа API
Добавьте ключ в config/services.php и создайте файл ключа public/{key}.txt с содержимым ключа для проверки IndexNow.
Интеграция IndexNow в Symfony
В Symfony удобнее реализовать отправку через сервис и подписчик событий Doctrine:
1. Сервис IndexNowSender
namespace App\Service;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class IndexNowSender
{
private $httpClient;
private $apiKey;
public function __construct(HttpClientInterface $httpClient, string $apiKey)
{
$this->httpClient = $httpClient;
$this->apiKey = $apiKey;
}
public function sendUrl(string $url): bool
{
$payload = [
'host' => parse_url($url, PHP_URL_HOST),
'key' => $this->apiKey,
'keyLocation' => 'https://example.com/'.$this->apiKey.'.txt',
'urlList' => [$url],
];
$response = $this->httpClient->request('POST', 'https://api.indexnow.org/indexnow', [
'json' => $payload
]);
return $response->getStatusCode() === 200;
}
}
2. Подписчик на события Doctrine
namespace App\EventListener;
use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs;
use App\Entity\Article;
use App\Service\IndexNowSender;
class IndexNowDoctrineListener
{
private $indexNowSender;
public function __construct(IndexNowSender $indexNowSender)
{
$this->indexNowSender = $indexNowSender;
}
public function postPersist(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
if (!$entity instanceof Article) {
return;
}
$url = 'https://example.com/article/'.$entity->getSlug();
$this->indexNowSender->sendUrl($url);
}
public function postUpdate(LifecycleEventArgs $args): void
{
// Аналогично postPersist
$this->postPersist($args);
}
}
3. Регистрация сервиса и слушателя
В services.yaml определите сервис и тег для слушателя Doctrine.
Интеграция IndexNow в Yii2
Yii2 позволяет просто создавать компоненты и подписываться на события ActiveRecord. Рассмотрим пример:
1. Создание компонента IndexNowComponent
namespace app\components;
use yii\base\Component;
use yii\httpclient\Client;
class IndexNowComponent extends Component
{
public $apiKey;
public $apiUrl = 'https://api.indexnow.org/indexnow';
public function sendUrl(string $url): bool
{
$client = new Client();
$payload = [
'host' => parse_url($url, PHP_URL_HOST),
'key' => $this->apiKey,
'keyLocation' => 'https://yourdomain.com/' . $this->apiKey . '.txt',
'urlList' => [$url],
];
$response = $client->post($this->apiUrl, $payload)->send();
return $response->isOk;
}
}
2. Использование в модели ActiveRecord
namespace app\models;
use yii\db\ActiveRecord;
use Yii;
class Article extends ActiveRecord
{
public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
$url = Yii::$app->urlManager->createAbsoluteUrl(['article/view', 'id' => $this->id]);
Yii::$app->indexNow->sendUrl($url);
}
}
Советы по оптимизации и масштабированию
Для крупных проектов важно не отправлять URL при каждом изменении, а накапливать и отправлять пакетами. Это можно сделать через очереди, cron-задачи или фоновые воркеры. Также важно реализовать повторные попытки отправки при ошибках и логирование для мониторинга.
Чтобы упростить работу, можно использовать готовые инструменты и плагины для WordPress, например, Clearfy Pro, который помогает оптимизировать SEO и интеграции с IndexNow.
Заключение
Интеграция IndexNow в PHP-фреймворки — несложная задача, если использовать возможности событий, очередей и сервисных классов. Laravel, Symfony и Yii2 хорошо подходят для построения надежной отправки URL с учетом особенностей каждого проекта. В результате вы получите актуальный индекс в поисковых системах, что положительно скажется на трафике и ранжировании.