За последние 24 часа нас посетили 21023 программиста и 1465 роботов. Сейчас ищут 1024 программиста ...

Ошибка сервера при 2-х кликах/сек на ссылку

Тема в разделе "PHP для новичков", создана пользователем виталий032, 5 мар 2018.

  1. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Делаю систему лайков и дислайков.

    При очень частом нажатии на ссылку (over 99 в сек:)), у меня это иконка пальца (большого), в ответе от сервера вот это:
    Код (Text):
    1. {
    2.     "message": "Server Error"
    3. }{
    4.     "message": "Server Error"
    5. }
    Как это можно исправить? Сервер тонет от запросов, не соблюдается очередь запросов, или что?

    // post.blade.php
    HTML:
    1. <a class="likes" href="#" onclick="likeAction(event)" data-set="/like/add"
    2.                   data-unset="/like/delete" data-pid="{{ $post->id }}">
    3.   <i class="fa fa-thumbs-up {{ $post->liked ? 'green' : '' }}" aria-hidden="true"></i>
    4.  
    5.   <span class="{{ $post->liked ? 'green' : '' }}">{{ $post->likes ?: '' }}</span>
    6. </a>
    // main.js
    Код (Javascript):
    1. function likeAction(e) {
    2.     e.preventDefault();
    3.     let elem = $(e.target);
    4.  
    5.     if (!elem.hasClass('likes')) {
    6.         elem = elem.parents('.likes');
    7.     }
    8.  
    9.     let likeExists = elem.children('i').hasClass('green');
    10.     elem.children().toggleClass('green');
    11.  
    12.     likeExists ? unsetLike(elem) : setLike(elem);
    13. }
    14.  
    15. function setLike(elem) {
    16.     let url = elem.attr('data-set');
    17.     let id = elem.attr('data-pid');
    18.  
    19.     let req = sendRequest({post_id: id}, url);
    20.     req.then(
    21.         response => {
    22.             if (+response === 0) {
    23.                 elem.children('span').html('');
    24.             } else {
    25.                 elem.children('span').html(response);
    26.             }
    27.         }
    28.     );
    29. }
    30.  
    31. function unsetLike(elem) {
    32.     let url = elem.attr('data-unset');
    33.     let id = elem.attr('data-pid');
    34.  
    35.     let req = sendRequest({post_id: id}, url);
    36.     req.then(
    37.         response => {
    38.             if (+response === 0) {
    39.                 elem.children('span').html('');
    40.             } else {
    41.                 elem.children('span').html(response);
    42.             }
    43.         }
    44.     );
    45. }
    // LikeController.php
    PHP:
    1. public function __construct(Like $like,Dislike $dislike,Post $post)
    2.     {
    3.         $this->like = $like;
    4.         $this->dislike = $dislike;
    5.         $this->post = $post;
    6.     }
    7.  
    8.     /**
    9.      * @param ValidateService $validateSvc
    10.      * @return string
    11.      */
    12.     public function add(ValidateService $validateSvc)
    13.     {
    14.         $userId = request()->user()->id;
    15.         $postId = request()->input('post_id');
    16.  
    17.         // check if string from client contain only digits (one or more)
    18.         if(!$validateSvc->validatePostId($postId))
    19.             return 'Non-numeric postId';
    20.  
    21.         $dislikeExists = $this->checkIfDislikeExists($userId,$postId);
    22.  
    23.         $postRec = $this->post->getPostById($postId);
    24.  
    25.         // if dislike exists we need to delete it
    26.         if($dislikeExists)
    27.         {
    28.             if ($this->dislike->deleteByUserIdAndPostId($userId,$postId))
    29.                 $this->decrementDislikesNum($postRec);
    30.         }
    31.  
    32.         // add like
    33.         if ($this->like->createByUserIdAndPostId($userId,$postId))
    34.             $likesNum = $this->incrementLikesNum($postRec);
    35.  
    36.         return $likesNum;
    37.     }
    38.  
    39.     public function delete(ValidateService $validateSvc)
    40.     {
    41.         $userId = request()->user()->id;
    42.         $postId = request()->input('post_id');
    43.  
    44.         if(!$validateSvc->validatePostId($postId))
    45.             return 'Non-numeric postId';
    46.  
    47.         $postRec = $this->post->getPostById($postId);
    48.  
    49.         if ($this->like->deleteByUserIdAndPostId($userId,$postId))
    50.             $likesNum = $this->decrementLikesNum($postRec);
    51.  
    52.         return $likesNum;
    53.     }
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    В логах такая ошибка: (через каждые примерно 12 запросов)
    Код (Text):
    1. [2018-03-05 14:17:27] production.ERROR: No application encryption key has been specified. {"exception":"[object] (RuntimeException(code: 0): No application encryption key has been specified. at E:\\openserver\\OpenServer\\domains\\d-list.ru_dev\\vendor\\laravel\\framework\\src\\Illuminate\\Encryption\\EncryptionServiceProvider.php:42)
    2. [stacktrace]
    Перегенерировать ключ пробовал (php artisan key:generate), проблему не решило.

    [UPDATE]
    Проблему частично решил командой (php artisan config:cache).
    Теперь даже при очень частом клике ошибки сервера нет, но накручиваются лайки через упорное кликание:eek:
     
    #3 виталий032, 5 мар 2018
    Последнее редактирование: 5 мар 2018
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    хм... а что вы хотите от openserver под виндой? Оно предназначено для разработки и не обязано держать нагрузки )
     
    виталий032 нравится это.
  5. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Написал такой "костыль". Думаю на юзабилити это не отразится негативно. По крайней мере работает корректно и не отправляется много запросов)
    Код (Javascript):
    1. function likeAction(e) {
    2.     if (typeof likeTimer === 'undefined') {
    3.         likeTimer = 0;
    4.     }
    5.  
    6.     e.preventDefault();
    7.     let elem = $(e.target);
    8.  
    9.     if (!elem.hasClass('likes')) {
    10.         elem = elem.parents('.likes');
    11.     }
    12.  
    13.     clearTimeout(likeTimer);
    14.     likeTimer = setTimeout(function () {
    15.         let likeExists = elem.children('i').hasClass('green');
    16.         elem.children().toggleClass('green');
    17.      
    18.         likeExists ? unsetLike(elem) : setLike(elem);
    19.     },500);
    20. }
     
    #5 виталий032, 6 мар 2018
    Последнее редактирование: 6 мар 2018
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    виталий032 нравится это.