1. PHP / Говнокод #2093

    +159.7

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    <?php
    $file_name = 'http://www.****';
    //$html_string = @file_get_contents($file_name);
     ob_start();
     readfile($file_name);
     $html_string = ob_get_contents();
     ob_end_clean();
    ?>

    копаю проект, на котором идет загрузка данных из инета...
    хваталка там про жесть .... автор решил, что использовать одну функцию будет слишком просто ...
    хотя отчасти я его понимаю... скорее всего все жутко тормозило...
    сам в детстве так ошибался, если дергаешь из инета стандартными средствами что-нибудь, то там нельзя задать таймаут. и если тебя вдруг забанили, то вся дергалка виснет обычно минуты на полторы-две. А то, что мы тут видим - это танцы с бубном, а вдруг заработает... не люблю когда так делают :(
    PS: ну если @ в коде встречается - то автора можно сразу добивать чем-нибудь тяжелым... особенно сильно хотелось это сделать, когда убил часов 10 на поиск места, где происходит ошибка и почему выводится белый экран...

    Запостил: nicolay-punin, 03 Ноября 2009

    Комментарии (32) RSS

    • Не согласен насчет @. Пока исключения не кидаются стандартными функциями, без нее в ряде случаев сложно обойтись. Тонкость @ как раз в том, что ее нужно уметь грамотно использовать.
      Ответить
      • Если исключения кидаются, их нужно ловить и обрабатывать, а не давить. А для того, чтобы не оконфузиться на продакшене есть error_reporting и log_errors. В противном случае, как и говорит топикстартер, отладка превращается в долгое и нудное перебирание стога сена в поисках иголки.
        Ответить
        • Не кипятитесь.
          Исключительные ситуации действительно нужно обрабатывать, иначе зачем они нужны. Другое дело КАК обрабатывать и КАК ловить. Поставить тяфку, ещё не значит отказаться от обработки исключения. Функция может сама вернуть код ошибки или вернуть false, а сама ошибка может быть получена с использованием другой функции. Кроме того тяфка может помочь в том случае, когда вас не устраивают приводимые ошибки. Например функция, которая возвращает false при неудаче, но вас ещё и не устраивает пустая строка. Тогда вы их можете обработать вместе, заглушив оригинальную ошибку тяфкой.
          Тяфка -- это не отказ от обработки ошибок, а возможность обработать исключительную ситуацию по-другому.
          PHP предоставляет достаточную свободу действий. Вы вольны выбрать метод, дать PHP выбросить ошибку или обработать ответ функции.
          А вот если её (тяфку) некорректно используют -- это уже проблема программиста.
          try catch блоки сами по себе не так уж и плохи, но можно использовать их во зло:
          try{
              throw(1);
          }
          catch(...) { }

          Возможность такого использования не говорит о том, что их нужно в топку...
          Ответить
          • Согласен, лишь одно НО. Исключения когда-то были придуманы, чтобы уйти от наследия Си, когда ошибка обозначалась возвратом заведомо невозможного значения. Но это уже вопрос идеологического характера: использовать коды возврата или исключения.
            Ответить
        • Вы, видимо, не поняли о чем я говорю.
          В текущей реализации PHP часть стандартных функций при возникновении исключительной ситуации _всегда и независимо ни от чего_ дополнительно генерируют ошибку помимо возврата кодов ошибок. Естественно, ошибка попадает в еррор-лог независимо от того, обработана она в коде или нет. Подобное поведение стандартных функций в ряде случаев вынуждает использовать тявку - давить лишнюю ненужную генерацию ошибки, которая будет обработана.
          Одним из решений этой проблемы может быть введение вброса исключений стандартными функциями PHP.
          И опять же, использование инструмента не в том месте не по назначению - проблема не инструмента, а использующего его.
          Ответить
          • В текущей реализации PHP часть стандартных функций при возникновении исключительной ситуации _всегда и независимо ни от чего_ дополнительно генерируют ошибку помимо возврата кодов ошибок

            А кто нам мешает перехватывать эти ошибки и бросать по ним исключения??? К примеру, я это делаю так:

            class ScriptException extends Exception
            {
            	function __construct($file,$line,$msg)
            	{
            		parent::__construct('Error in FILE: '.$file.', LINE: '.$line.': '.$msg',0);
            	}
            }
            
            function stdErrorHandler($errno, $errstr, $errfile, $errline)
            {
            	throw new ScriptException($errfile,$errline,$errstr);
            }
            
            set_error_handler('stdErrorHandler');
            Ответить
            • афигеть ... это он так и на вварниги и на нотисы будет матюгаться...

              это тогда придется писать почти идеально, чтобы с такой конструкцией все конкретно работало...
              да и библу ты какую-нибудь врядли в этом случае заюзаешь... если внутри там вварнги есть...
              Ответить
              • первый аргумент $errno, передаваемый каллбек-функции ( в моем случае - stdErrorHandler() ) - есть уровень ошибки. Можешь смотреть по нему, и бросать исключения, например, только на ерроры. А нотисы и ворнинги пропускать.

                И кстати, пишу исключительно с включенным E_ALL, чего и вам желаю. Потраченная минута на заштопку нотисов и ворнингов дает выигрыш часов при поиске багов в дальнейшем.
                Ответить
                • Согласен )) на этом можно построить красивую систему ))
                  Ответить
            • Почему вы хотите писать на PHP?
              Почему вы выбрали его, а не Java или C#?
              Ответить
              • я хочу ? ;(
                уж извините, я не выбирал на чем мне писать... такова жизнь ....
                это не значит, что php как язык плох, я думаю временами он очень не плох, особенно версия 5.3
                хотя по ночам я мечтаю о java или о С++ ... давно в них ничего не писал....
                Ответить
                • Вообще это вопрос был к Yozheg. =]
                  Но ваш ответ явно говорит о том, что мой вопрос требует пояснения.
                  В современном мире есть огромное множество языков. Каждый волен выбрать тот, на котором он будет писать проект, каждый и выбирает язык. Начиная изучать PHP, вы думали о чём-то, вы начали изучать и создавать проекты на нём с некоторой целью.
                  Так вот вопрос в том, что именно двигало человеком, когда он начал изучать PHP.
                  Жизнь за вас ничего не выбирала. У вас была задача и вы начали её решать, выбирая средства.

                  Только в школе "заставляют". Меня "заставляли" программировать на бейсике и паскале....
                  Правда вот друга моего сейчас "заставляют обстаятельства" программировать на фортране, но это отдельная история.
                  Ответить
                  • >>Вообще это вопрос был к Yozheg. =]
                    ссори, не сразу глянул на вложения... вопрос был после моего коммента .. извини, что влез не в свое дело...
                    >>Так вот вопрос в том, что именно двигало человеком, когда он начал изучать PHP.
                    ну раз уж пошел разговор, простите меня, я отвечу более развернуто
                    у нас в обществе есть несколько стериотипов,
                    например, если сайт, то это конечно php, не java, не си, а именно php ... надо отдать должное разработчикам php, что их язык добился таких вершин...

                    простейшая ситуация, тебя просят сделать сайтик, на чем ты будешь его делать ? да согласен, можешь сам выбрать на чем... пойдем дальше, где его размещать?
                    если писать будешь на Си - это одни сложности, если на JSP - то стоимость размещения безделушки будет в разы отличаться от стоимости размещения php-хостинге...

                    поэтому если просят сделать сайт - делаешь его на php ...

                    так вот, вопрос в том, что пишешь на том и решаешь те задачи, за который в данный момент платят...
                    Ответить
                    • >ссори, не сразу глянул на вложения...
                      Ничего страшного.

                      Проекты бывают разные. Это да. То есть, в зависимости от проекта вы выбираете инструмент. Если проект крупный и дорогой, то вряд ли встанет проблема решать ли его на JSP ASP PHP из-за хостинга, тут будут играть факторы устойчивость расширяемости поддерживаемости и т.д.
                      Если проект небольшой или "скорый", то тут вопрос о том кого быстрее можно найти и как "испечь" проект или как создать его подешевле.

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

                      Я начал прогать на PHP, потому что сделать на Java маленький проект просто дорого и искать потом тех, кто будет его поддерживать сложнее, PHP дешевле.
                      Ответить
                      • а я хотел бы програть на java или си, но работаю там, где все пишут на php ...
                        Но я продолжаю мечтать о лучшем ))
                        некоторые вещи в php меня добивают ... точнее добивает, что можно "так" делать, а значит растет сообщество быдлокодеров, которые делают только так...
                        Ответить
                        • >я хотел бы програть на java или си
                          Всё же это достаточно разные вещи. Java поддерживает одну парадигму, а C другую, при этом не просто поддерживают, а основаны на ней.

                          >Но я продолжаю мечтать о лучшем
                          Нужно пытаться двигаться. Изучите язык, приёмы, попробуйте приложиться. Будете создавать Java-applets для удобства пользователей. =]
                          А вот на C приложиться в сфере создания сайтов уже сложнее. =[ Это скорее язык "демонов". Крупное приложение на C -- это слишком затратно.

                          >работаю там, где все пишут на php
                          Да уж...
                          Мне PHP был удобен простотой и лёгкостью выполнения поставленных задач в смысле серверных сценариев. Написать сценарий на C -- это подвиг. Нам показывали один древний движок форума, написаный на C под Apache cgi , возможности слабые, а код умопомрачительный... Но это что-то очень старое, когда альтернатива только Perl. Нам показывали для устрашения и внушения уважения к тем, кто начинал программировать такие вещи.
                          А сейчас форум может и школьник написать на PHP без проблем.
                          Ответить
                          • >>А вот на C приложиться в сфере создания сайтов уже сложнее
                            это своя ниша, где важна производительность...

                            ссори, я думал парадигм не так много как языков... есть процедурно-ориентированная, есть объектно-ориентированное... остальное конкретные элементы языка или его библиотек... ну и может быть чуть-чуть другой синтаксис...
                            а так вообще какая разница...
                            Ответить
              • Пардон, долго не был у компа.
                Я вообще электронщик, писал прошивки для контроллеров и ПЛИСин на ASM и AHDL - отсюда базовые знания программинга. Наверно отсюда же любовь к чистому коду :). В какой-то момент небольшой группой лиц по предварительному сговору взяли и сделали сайт по электронике. У меня на тот момент было знание хтмл, немножко флеш, но только на уровне нарисовать и разверстать. Очень быстро стало понятно, что для того чтоб сделать хороший сайт, нужно что-то бОльшее. Короче, выучил пых, жабаскрипт, экшнскрипт, че там еще... мускуль... Ну и в результате даже на работу устроился веб-программером :) Затянуло...
                В принципе, я знаю Жаву, не на уровне гуру, но если Родина прикажет - буду писать на ней. Но пока у меня для себя нет прикладных задач, для которых это нужно - а значит, и нет стимула углубляться. И с материальной точки зрения, пыховым прогерам не сильно меньше платят, чем тем же жавистам :)
                А C# вообще не знаю и не хочу. Не люблю мелкомягких и их быдлотехнологии.
                Ответить
                • >>А C# вообще не знаю и не хочу. Не люблю мелкомягких и их быдлотехнологии.

                  зачед ))) поддерживаю...
                  Ответить
                  • Вообще, до того, как я сам попытался с C# познакомиться, я к нему был очень подозрителен. Позже мне стало понятно, что C# -- это очень хорошее решение для "промышленного" программирования под Windows. Имея ограниченные финансовые и временные ресурсы и используя MS технологии, можно под Windows реализоваться быстрее, чем используя что-либо другое. Кроме того, оказалось, что сама JIT технология может иметь неожиданное приложение: оптимизационное управление потоками на высокопроизводительных машинах.
                    Ответить
                    • >>Позже мне стало понятно, что C# -- это очень хорошее решение для "промышленного" программирования под Windows

                      А чем Java плохо? там столько уже сделано. бери да используй...
                      в принципе идеи C# - целиком содрано с java.
                      И почему windows - есть же mono...
                      Ответить
                      • >А чем Java плохо?
                        Ничем не плохо. Но и ни одного преимущества у Java нету. Скорее есть недостатки: не разместить классы в стеке или создать быструю работу с прямыми массивами без необходимости поддерживать проверки и технологию "удлиняемого массива". (указатели в unsafe fix блоках). Последнее очень может пригодиться для работы с графикой.

                        А MS .NET среда разработки -- это сразу вам и компилятор в MSIL, и огромный набор инструментов, и библиотеки от производителя ОС, и многое другое. Плюс оптимизационные возможности "компилятора на лету". Ни секунды не сомневаюсь, что на C# под Windows будет писаться быстрее и более производительно, чем на Java. Просто многие технологией C# пока банально пренебрегают.

                        >И почему windows - есть же mono...
                        Да, пожалуйста. .NET технология не зажата рамками Windows. Однако уже никак нельзя говорить о "библиотеках от производителя".
                        Ответить
                        • аргументированно )))) да возможно в чем-то лучше... я не копал C# так глубоко, да и Java я больше среднячок...
                          Но на счет библ - по спорю, у Java набор каких либо решений шире, больше, причем, если чего-нибудь не устраивает, то всегда есть альтернативы...

                          на счет классов в стеке - спрашивается нафига ???
                          на счет "удлиняемого массива"... извините меня, это как-то странно мерять два языка одной небольшой оптимизацией... если уж на то пошло, и нужно оптимизировать какой-то код, или использовать функции системы, то в java можно вкомпиливать си-код...
                          менеджеры процессов, анализаторы памяти в том-же netbeans именно так и сделаны...
                          Ответить
                          • Дело не в аргументации или споре и абстрактном вопросе выбора.
                            Если есть конкретная задача, тогда выбор можно делать. Никаких явных преимуществ у Java нет, зато есть мелкие недостатки.

                            Да, из Java построены города. Но всё, что может быть необходимым в C# тоже уже есть, благо MS на это не пожалело ресурсов.
                            Ответить
                            • и все-таки С# предполалает в качестве основы системы винду...
                              чтобы строить города из MS технологий, нужно денег немерянно....
                              про лицензию не забыли?... одна винда стоит дофига, а к ней ещё офис (ну какая система без отчетов, и без офиса...) и много чего там...
                              Ответить
                              • Да. Я с самого начала поставил Windows основной системой .NET, а C# -- основной язык .NET.
                                Денег "немеряно" не нужно. Нужно около 13 000 р. на одну рабочую станцию в офисе. Дома, мне обошлось в 11 500 на два компа: XP Home + Office 2007. Сколько не заглядывался в терминалы кофеен, ресторанов, торг. сетей -- везде Windows в различных вариациях. Значит деньги у бизнеса находятся. А фреймворк уже в системе. Почему бы и не написать на C#? Кроме того должна отпасть проблема совместимости версий Windows, так как совместимым должен быть только .NET, который MS может дописать легко для своей же пользы.
                                Как ни крути, а никаких явных недостатков у C# нет.

                                Я вообще никого не поддерживаю и не выделяю. Если есть момент, где что-то можно успешно использовать, то пожалуйста. Но ужасно раздражает, когда бессмысленно что-то отвергается из каких-то "религиозных" побуждений.
                                Ответить
                                • а у нас в офисе 56 рабочих станций... + ещё сервера ...
                                  56x13000 = 728000 - почти круглая сумма, а спрашивается за что ?? этих денег можно было б не платить.... пусть даже опен офис хуже, ворда, есть еще много всяких пусть...
                                  проще было найти одного админа, который бы всем бы сделал и следил за той же убунтой...
                                  все у всех работает и везде красота... и экономия на лицо...
                                  Ответить
                      • * технологией .NET, конечно же, пренебрегают
                        Ответить
            • для этого есть исключение ErrorException
              Ответить
      • да @ нужно использовать грамотно, ведь зачемт-то её же придумали...

        но я все-таки выступаю за отказ от нее... ведь goto тоже есть, но это не значит, что его нужно пихать направо и налево...
        для меня @ - эток как goto вместо циклах... можно долго религиозно спорить, но экспертами давно доказано(ссори что не привожу ссылку, искать долго, но точно где-то видел), что оно зло...

        например, где можно заюзать её

        $f= fopen('a.txt','r');
        if($f) ....

        если файла не существует, то кидается вваринг... прямо-таки не разрешимая ситуация...
        для любителей Си-стиля - да...
        но вообще-то есть функции is_file() или file_exists() - проверка которыми позволяет избегать вваринга...
        собственно баш на баш.... но можно найти случаи, когда своевременное сообщие вваринг облегчит поиск причины неполадки...
        Ответить
        • а, скажем, fsockopen так не обработаешь
          Ответить
          • когда он вваринги пихает ?
            если timeout или не правильный адрес... тогда он пихает аж две штуки...
            но это исключительные ситуации, их нельзя подавлять... о них нужно иметь запись в журнале, чтобы видеть каритну происходящего...
            тут все нормально продумано...
            Ответить

    Добавить комментарий