Мины PHP в целом [закрываются]

С некоторыми изменениями вы можете использовать любой пользовательский класс в качестве вспомогательного компонента. Вы должны использовать операторы namespace и use для имеющегося у вас класса, см. Ниже

<?php
namespace app\components;

class Response
{

    /**
     * @var array
     */
    private static $response = array
        (
        '9999' => array('description' => "Unexpected Response", 'definite' => true, 'status' => "Indeterminate"),
        '00' => array('description' => "Success", 'definite' => true, 'status' => "Success"),
        'NNC_AUTH_01' => array('description' => /*"Status unknown, please wait for settlement report"*/"System Error", 'definite' => true, 'status' => "Failure"),
        'NNC_VTU_01' => array('description' => "Ttimed out", 'definite' => false, 'status' => "Indeterminate"),
        'NNC_VTU_02' => array('description' => "Exceeded max number of requests for Phone number per time period", 'definite' => true, 'status' => "Failure"),
        'NNC_VTU_03' => array('description' => "Invalid target MSISDN supplied", 'definite' => true, 'status' => "Failure"),
        '-1' => array('description' => "Not successful", 'definite' => false, 'status' => "Failure")
    );

    /**
     * @param $respCode
     */
    public static function getResponseByCode($respCode)
    {
        if (isset(self::$response[$respCode])) {
            return self::$response[$respCode];
        }

        return self::$response['9999'];
    }

}

Сохраните класс Above в файле с именем Response.php в папке app\components, если используете [ 115] или common\components, если вы используете advanced-app, но не забудьте изменить namespace в коде.

Затем можно вызвать функцию getResponseByCode() как app\components\Response::getResponseByCode($responseCode) или common\components\Response::getResponseByCode($responseCode)

.
35
задан David 30 December 2009 в 14:59
поделиться

20 ответов

Я не уверен, рассчитывает ли это, но потребность скомпилировать Сценарии PHP является огромной проблемой производительности. В любом серьезном проекте PHP Вам нужен некоторый кэш компилятора как APC, eAccelerator, Акселератор PHP , или (реклама) Платформа Зенда .

19
ответ дан cg. 27 November 2019 в 06:26
поделиться

в самом начале каждый мог, провел много времени, отладив такой код:

$a = 1;
echo $a;      # 1
echo "$a";    # 1
echo '$a';    # $a

проклятые кавычки! очень печальный :(

1
ответ дан SilentGhost 27 November 2019 в 06:26
поделиться

Просто мысль о еще одном удивлении. array_map, который применяет обратный вызов к массиву, является серьезным уничтожителем производительности. Я не полностью уверен, почему, но я думаю, что это имеет некоторое отношение к копии PHP на механизме записи для циклов.

1
ответ дан David 27 November 2019 в 06:26
поделиться

Другая ловушка в PHP, я видел эту ошибку от людей, которые происходят из других языков, но не часто.

<?php
/**
 * regular
 */
echo (true && true); // 1
echo (true && false); // nothing

echo (true || false); // 1
echo (false || false); // nothing

echo (true xor false); // 1
echo (false xor false); // nothing

/**
 * bitwise
 */
echo (true & true); // 1
echo (true & false); // 0

echo (true | false); // 1
echo (false | false); // 0

echo (true ^ false); // 1
echo (false ^ false); // 0
?>
2
ответ дан Ólafur Waage 27 November 2019 в 06:26
поделиться

Проблемами производительности с приложениями PHP обычно является одно из следующего:

  • Доступ к файловой системе - чтение и запись в диск
    • Это - то, где APC, eAccelerator, и т.д. пригождается, они уменьшают доступ к файловой системе путем кэширования, проанализировал файлы PHP в памяти
  • База данных - медленные запросы, большие наборы данных
  • Сеть ввод-вывод - доступ к внешним ресурсам

, довольно редко столкнуться с проблемами производительности с PHP (или любое веб-приложение, записанное на любом языке). Вышеупомянутыми проблемами обычно являются порядки величины медленнее, чем выполнение кода.

Как всегда, представьте свой код!

2
ответ дан Ryan Doherty 27 November 2019 в 06:26
поделиться

Общая память при выполнении PHP. Много крупных проектов просто включают все файлы класса и используют их, когда им нужны они. Это добавляет к общей памяти, которую PHP должен использовать для каждого выполнения.

Также проекты с помощью Кадров или IFrames, поскольку это могло легко удвоить использование памяти.

Так используют условную загрузку Ваших файлов класса, ничего не имеют, загрузил это, Вы не используете

2
ответ дан Ólafur Waage 27 November 2019 в 06:26
поделиться

Если Вы привыкнете к языкам с интеллектуальными логическими операторами, то Вы попытаетесь сделать вещи как:

$iShouldTalkTo = $thisObj || $thatObj;

В PHP, $iShouldTalkTo теперь булево значение. Вы вынуждены записать:

$iShouldTalkTo = $thisObj ? $thisObj : $thatObj;

Из всех примеров того, как ранние проектные решения в PHP пытались содержать руки некомпетентных программистов в обмен на создание помех компетентным, которые могут быть тем, который раздражает меня больше всего.

Глубокое повреждение мозга в эти switch() конструкция имеется в большом количестве. Рассмотрите это:

switch($someVal) {
case true  :
    doSomething();
    break;
case 20    :
    doSomethingElse();
    break;
}

Оказывается, что doSomethingElse() никогда не будет называться, потому что 'случай, верный', поглотит весь истинные случаи $someVal.

Думают, что это допустимо, возможно? Ну, попробуйте этого:

for($ix = 0; $ix < 10; $ix++) {
    switch($ix) {
    case 3  :
        continue;
    default :
        echo ':';
    }
    echo $ix;
}

Предположение, каков его вывод? Должен быть:0:1:2:4:5:6:7:8:9, правильно? Нет, это-:0:1:23:4:5:6:7:8:9. Таким образом, это игнорирует семантику из continue оператор и рассматривает его как break.

3
ответ дан chaos 27 November 2019 в 06:26
поделиться

Мой любимый глюк PHP:

Полагают, что это включает:

# ... lots of code ...
$i = 42;
# ... more code ...

Затем использование это включает где-нибудь:

for($i = 0; $i < 10; $i++){
    # ...
    include 'that_other_file.php';
}

Затем попытка предположить, сколько раз выполняет цикл. Да, однажды. Лексический обзор (и надлежащий динамический обзор) являются оба решенными проблемами. Но не в PHP.

3
ответ дан jrockway 27 November 2019 в 06:26
поделиться

Большой глюк, которого я видел, что люди становятся жертвой, является точностью (в php и других языках).

, Если Вы хотите немного забавы, сравнивают любое плавание с целым с> = и узнают, сколько раз Вы получаете ожидаемый результат.

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

, Например - матрица

Матрица продается в единицах 1 ярда или 1 половине двора, а также поддержания материально-технических ресурсов точного измерения, оставленного матрицы.

, Если этой системы не выражают в целых числах и вместо этого выражают в плавающих точках, она сделает его невероятно трудно для создания тела decisons.

Ваш лучший выбор состоит в том, чтобы выразить 1 половину двора как 1, например, если бы у Вас есть 300 ярдов матрицы, у Вас были бы материально-технические ресурсы 600 (600 половин единиц двора).

Так или иначе, это - мой глюк - время для рефакторинга 4 месяцев программирования из-за не понимания точности....

4
ответ дан Syntax 27 November 2019 в 06:26
поделиться

@ ошибочного глушителя нужно всегда избегать.

пример:

// Don't let the user see an error if this unimportant header file is missing:
@include 'header.inc.php';

С кодом выше, Вы никогда не будете знать ни о каких ошибках ни в одном коде в header.inc.php или любой из функций, вызванных от header.inc.php, и если будет Фатальная ошибка где-нибудь, то Ваша веб-страница остановится без способа узнать, какова ошибка была.

5
ответ дан too much php 27 November 2019 в 06:26
поделиться

Не быть знающим приоритет оператора может вызвать некоторые проблемы:

if ($foo = getSomeValue() && $bar) {
    // …
}
// equals
if ($foo = (getSomeValue() && $bar)) {
    // …
}
5
ответ дан Gumbo 27 November 2019 в 06:26
поделиться

__autoload() оказался главной миной для меня недавно. Часть нашего унаследованного кода и использования библиотек class_exists(), и это пытается автоматически загрузить классы, которые никогда не предназначались, чтобы быть загруженными таким образом. Много фатальных ошибок и предупреждений. class_exists() может все еще использоваться, если у Вас есть автозагрузка, но второй параметр (новый начиная с PHP 5.2.0) должен быть установлен на false

5
ответ дан Jeremy DeGroot 27 November 2019 в 06:26
поделиться

Это было довольно очевидно после факта, но известный глюк имеет отношение к объему и ссылкам при использовании в foreach.

foreach($myArray as &$element){
   //do something to the element here... maybe trim or something more complicated
}
//Multiple lines or immediately after the loop

$element = $foobar;

последняя ячейка в Вашем массиве теперь стала $foobar, потому что ссылка в foreach выше находится все еще в текущем объеме контекста.

6
ответ дан David 27 November 2019 в 06:26
поделиться
  • foreach () тихо копирует массив в фоновом режиме и выполняет итерации через ту копию. Если у Вас будет большой массив, то это ухудшит производительность. В тех случаях, опциях ссылкой foreach (), которые в новинку для php5 или используют для () цикл.

  • знать о равенстве (==) по сравнению с идентификационными данными (== =).

  • знать, что составляет пустой () по сравнению с тем, что составляет isset ().

<час> [еще 1112] мины теперь, когда у меня есть еще некоторое время:

  • не сравнивают плавания для равенства. PHP не является matlab, и он просто не разработан для точной арифметики с плавающей точкой. Попробуйте этого:
if (0.1 + 0.2 == 0.3)
  echo "equal";
else
  echo "nope"; // <-- ding ding
  • Точно так же не забывают Ваш octals! Интервал w/начальный нуль снят как восьмеричное.
if (0111 == 111)
  echo "equal";
else
  echo "nope"; // <-- ding ding
7
ответ дан Pim Jager 27 November 2019 в 06:26
поделиться

ПУСТОЙ УКАЗАТЕЛЬ и эти "0" строка является чистым злом в Php

if ("0" == false) //true
if ("0" == NULL)  //true
if ("0" == "NULL")//true
10
ответ дан Robert Gould 27 November 2019 в 06:26
поделиться

Рекурсивные ссылки пропускают память

, Если Вы создадите два объекта и сохраните их в свойствах друг друга, то сборщик "мусора" никогда не будет касаться их:

$a = new stdClass;
$b = new stdClass;
$a->b = $b;
$b->a = $a;

Это на самом деле довольно легко сделать, когда большой класс создает маленький объект помощника, который обычно хранит основной класс:

// GC will never clean up any instance of Big.
class Big {
  function __construct() {
    $this->helper = new LittleHelper($this);
  }
}
class LittleHelper {
  function __construct(Big $big) {
    $this->big = $big;
  }
}

Целый PHP предназначен для коротких быстрых запросов страницы, они вряд ли устранят эту проблему. Это означает, что PHP не может зависеться от для демонов или других приложений, которые имеют длинную продолжительность жизни.

15
ответ дан too much php 27 November 2019 в 06:26
поделиться

require_once и include_once могут часто приводить к главным уничтожителям производительности при чрезмерном использовании. Если Ваш включать/требовать файл, который содержит класс... шаблон как так может сохранить некоторое серьезное время обработки.

class_exists("myFoo") or require("myFoo.someClass.php");

Обновление: Это - все еще проблема - http://www.techyouruniverse.com/software/php-performance-tip-require-versus-require_once

Обновление: Прочитайте выбранный ответ для следующего вопроса: производительность перенесла бы автозагрузку использования в php и поиск файла класса? , Если реализовано вдоль этих строк, Вы в значительной степени минимизируете максимально лучше всего, штрафы за файл включают/требуют.

13
ответ дан Community 27 November 2019 в 06:26
поделиться

Забавная мина: Глобальные переменные могут влиять $_SESSION когда register_globals идет. Но я предполагаю, что это - то, что происходит, когда register_globals, сама мина, включен.

11
ответ дан Richard Levasseur 27 November 2019 в 06:26
поделиться

Не получая сообщений компилятора для ветвей if/else:

if( $foo )
{
  some_function();
}
else
{
  non_existing_function();   // oops!
}

PHP не упомянет, что non_existing_function не существует, пока вы не попадете в ситуацию, когда $foo будет false.


Забываете установить:

error_reporting( E_ALL );

Поэтому уведомления не отлавливаются, тратя время на отладку:

  • несуществующие переменные
  • недопустимые свойства объекта
  • недопустимые ключи массива

Вставляете вместе строки разных "типов" / источников, не экранируя их:

// missing mysql_real_escape_string() or an int cast !
$sql = "SELECT * FROM persons WHERE id=$id";

// missing htmlentities() and urlencode() !
$html = "<a href='?page=$id'>$text</a>";  
2
ответ дан 27 November 2019 в 06:26
поделиться

Согласно Почему вызов функции (такой как strlen, count и т. Д.) Для указанного значения такой медленный?

Если вы передаете переменную в функцию по ссылке, а затем вызвать на нем функцию, это невероятно медленно.

Если вы перебираете вызов функции и переменная имеет большой размер, это может быть на много порядков медленнее, чем если бы переменная передавалась по значению.

Пример:

<?php
function TestCount(&$aArray)
{
    $aArray = range(0, 100000);
    $fStartTime = microtime(true);

    for ($iIter = 0; $iIter < 1000; $iIter++)
    {
        $iCount = count($aArray);
    }

    $fTaken = microtime(true) - $fStartTime;

    print "took $fTaken seconds\n";
}

$aArray = array();
TestCount($aArray);
?>

Это постоянно занимает около 20 секунд на моей машине (на PHP 5.3).

Но если я изменю функцию для передачи по значению (например, function TestCount ($ aArray) вместо function TestCount (& $ aArray) ), то она будет выполняться примерно за 2 мс. - буквально в 10 000 раз быстрее !

То же самое верно для любой функции, которая передает значение - как для встроенных функций, таких как strlen , так и для пользовательских функций.

Это довольно страшный брезент, о котором я раньше не подозревал!

К счастью, есть простой обходной путь, применимый во многих случаях - используйте временную локальную переменную внутри цикла и скопируйте ее в ссылочную переменную в конце.

2
ответ дан 27 November 2019 в 06:26
поделиться
Другие вопросы по тегам:

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