Задать вопрос
AllDecay
@AllDecay
Вечно отдыхающий.

Как оптимизировать мой php код?

Вообщем, написал обработчик репостов для паблика ВКонтакте. Подключил его к сайту. Все вроде бы нормально, но тут ребром стал вопрос, касающийся оптимизации.
<?
	if (isset($_POST['submit_form'])) {
if (empty($_POST["url"])) {
    echo '<div class="alert alert-danger" role="alert">Не указана ссылка на пост, который нужно репостить.</div>';
} elseif (empty($_POST["post"])) {
    echo '<div class="alert alert-danger" role="alert">Не указана ссылка для проверки репоста с Вашей стороны.</div>';
} else {
    $url = explode("-", $_POST["url"]);
    $postinfo = explode("_", $url[1]);
    $copy_url = explode("-", $_POST["post"]);
    $copyinfo = explode("_", $copy_url[1]);
    $members = file_get_contents("http://api.vk.com/method/groups.getMembers?group_id=" . $postinfo[0]);
    $members = json_decode($members);
    $members = $members->response->count;
    if ($members >= 300) {
        if ($postinfo[0] == $copyinfo[0]) {
            $status = file_get_contents("http://api.vk.com/method/wall.getById?posts=-" . $copy_url[1]);
            $status = json_decode($status);
            $status = $status->response;
            $post = $status[0]->copy_owner_id;
            if ($post == $gid) {
                $res = $dbh->query("SELECT COUNT(*) FROM `reposts` WHERE `id` = " . $postinfo[0]);
                if ($res->fetchColumn() == 0) {
                    $wall = file_get_contents("https://api.vk.com/method/wall.repost?v=4.102&object=wall-" . $postinfo[0] . "_" . $postinfo[1] . "&group_id=100562658&access_token=" . $token);
                    $wall = json_decode($wall);
                    $response = $wall->response;
                    $error = $wall->error;
                    if ($response->success == 1) {
                        $stmt = $dbh->prepare("INSERT IGNORE INTO `reposts` (id, url, repost, date) VALUES (:id, :url, :repost, :date)");
                        $stmt->bindParam(':id', $postinfo[0]);
                        $stmt->bindParam(':url', $_POST["url"]);
                        $stmt->bindParam(':repost', $_POST["post"]);
                        $stmt->bindParam(':date', $currentTime->getTimestamp());
                        $stmt->execute();
                        $dbh = null;
                        $link = "https://vk.com/wall" . $gid . "_" . $response->post_id;
                        echo '<div class="alert alert-success" role="alert">Репост сделан! Проверить его наличие Вы можете по этой ссылке: <a href="' . $link . '" target="_blank">' . $link . '</a></div>';
                    } else {
                        echo '<div class="alert alert-danger" role="alert">Ошибка! Сервер ВКонтакте вернул ответ с кодом ошибки: ' . $error->redirect_uri . '</div>';
                    }
                } elseif ($res->fetchColumn() !== 0) {
                    $qwe = $dbh->query("SELECT * FROM `reposts` WHERE `id` = " . $postinfo[0]);
                    $row = $qwe->fetch();
                    $repostTime = new DateTime(date('Y-m-d H:i:s', $row['date']));
                    $interval = $currentTime->diff($repostTime);
                    if ($interval->d >= 7) {
                        $wall = file_get_contents("https://api.vk.com/method/wall.repost?v=4.102&object=wall-" . $postinfo[0] . "_" . $postinfo[1] . "&group_id=100562658&access_token=" . $token);
                        $wall = json_decode($wall);
                        $response = $wall->response;
                        $error = $wall->error;
                        if ($response->success == 1) {
                            $stmt = $dbh->prepare("INSERT IGNORE INTO `reposts` (id, url, repost, date) VALUES (:id, :url, :repost, :date)");
                            $stmt->bindParam(':id', $postinfo[0]);
                            $stmt->bindParam(':url', $_POST["url"]);
                            $stmt->bindParam(':repost', $_POST["post"]);
                            $stmt->bindParam(':date', $currentTime->getTimestamp());
                            $stmt->execute();
                            $dbh = null;
                            $link = "https://vk.com/wall" . $gid . "_" . $response->post_id;
                            echo '<div class="alert alert-success" role="alert">Репост сделан! Проверить его наличие Вы можете по этой ссылке: <a href="' . $link . '" target="_blank">' . $link . '</a></div>';
                        } else {
                            echo '<div class="alert alert-danger" role="alert">Ошибка! Сервер ВКонтакте вернул ответ с кодом ошибки: ' . $error->error_code . '</div>';
                        }
                    } else {
                        $diff = date('d.m.Y H:i:s', $row['date'] + 604800);
                        echo '<div class="alert alert-danger" role="alert">Сожалеем, но мы уже делали с Вами репост на этой неделе. Следующий репост будет возможен: ' . $diff . '</div>';
                    }
                }
            } else {
                echo '<div class="alert alert-danger" role="alert">Отсутствует репост с Вашей стороны или неверно указаны ссылки на записи. Будьте внимательнее!</div>';
            }
        } else {
            echo '<div class="alert alert-danger" role="alert">Указаны ссылки на разные группы.</div>';
        }
    } else {
        echo '<div class="alert alert-danger" role="alert">Минимальное количество участников в сообществе - 300. У Вас же их: ' . $members . '</div>';
    }
}
} ?>

Уже на первый взгляд видно, что слишком много условий, но я понятия не имею и не представляю какие из них можно сократить и как оптимизировать этот код. Очень нужна помощь.
  • Вопрос задан
  • 470 просмотров
Подписаться 3 Оценить 9 комментариев
Решения вопроса 2
0neS
@0neS
Как минимум убрать адскую вложенность, заменив это:
if (something) {
    doSomething();

    return true;
} else {
    return false;
}

на вот это:
if (!something) {
   return false;
}

doSomething();

return true;
Ответ написан
Комментировать
nazarpc
@nazarpc
Open Source enthusiast
Посмотрите что у вас повторяется. Как минимум сходу
json_decode(file_get_contents(http://api.vk.com/method/..."))->response
можно обернуть в одну функцию.
Fail fast, как вам уже подсказали, уберет некоторую вложенность.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dmitriylanets
@dmitriylanets
веб-разработчик
вам точно оптимизация нужна? возможно вы путаете с рефакторингом
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
если речь о тупой оптимизации, то переход на процедуры и денормализация данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы