Загрузка данных
 
Логин:   Пароль:      
Регистрация   Забыли пароль?

15 горячих:

Закрыть
Загрузить:
Указать:
Выравнивание:
Альт

Учите матчасть!!!

Учите матчасть!!!Последний месяц занимался кастингами людей к себе на работу, задача была простая - найти адекватного php разработчика у которого будет примерно средний уровень знаний. Самое главное что требовалось от кандидатов - это минимальный набор базовых знаний о том как работает PHP и прилегающие к нему технологии.

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

Вот вопросы которыми сейчас можно завалить людей которые пытаются получить работу.

Назовите способы подключения PHP к web серверу.


Зачем нужен протокол HTTP 1.1?


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


index.php
  1. <?php
  2.       session_start();
  3.      
  4.       $_SESSION['var'] = 'some value';
  5.  
  6.       echo '<a href="session.php">some link</a>';
  7. ?>

session.php
  1. <?php
  2.       session_start();
  3.      
  4.       echo $_SESSION['var'];
  5. ?>

Откуда PHP знает что лежит в куках - механизм передачи данных в cookies ?


Перепешите данный кусок кода на ваш вкус и цвет


  1. <?php
  2. //какой то большой абстрактный скрипт
  3. //
  4. // тут много разного кода, подключение к БД и прочая фигня
  5. //
  6.  
  7. $sql = 'SELECT * FROM table WHERE col='.$_GET['some_string_value'];
  8.  
  9. $result = mysql_query($sql);
  10.  
  11. while ($row = mysql_fetch_...) {
  12.     echo $row['col']."<br />";
  13. }
  14.  
  15. //тут конец скрипта
  16. ?>

Почему такой запрос будет тормозить, в чем зло такого запроса, как лечить ?


  1. SELECT * FROM TABLE WHERE col LIKE '%some_sting%';

Почему такой запрос лучше чем преведущий ?


  1. SELECT * FROM TABLE WHERE col LIKE 'some_sting%';

Почему в наборе функций для работы с MySQL есть pconnect?


Тут надо немного подумать и рассказать про то почему pconnect зло и зачем он вообще в жизни нужен.

Сверхзадача?


Вам как разработчику ставится сверх задача, например построить видео хостинг на котором будут изначально хранится 10М файлов (объем от 50ТБ) и с первого дня работы на него будут ходить 100K пользователей, это где то 1M-5M хитов. Вы как разработчик обладаете всеми нужными вам ресурсами: люди, машины, деньги и тд.

Что надо делать в первую очередь после получения минимального ТЗ ?

Это немногие из вопросов по ответам на которые можно определить адекватность разработчика.

Все желающие протестировать себя могут отписаться в комментариях или в личку.
Sych 14 июня 2009 12:26 комментариев: 21
:) 1 :(

Комментарии:
Довольно несложные вопросы… попытаюсь ответить:

1) способы: как длл (sapi) так и отдельно через интерфейс fastcgi
2) http 1.1 поддерживает keep-alive, т.е в одном коннекте клиент может слать несколько запросов
3) идентификация клиентов происходит по ид-сессий. Т.е сервер генерит ИД сессии и чтобы знать кто есть кто — высылает ИД в куки клиенту. Отсюда вывод что функии Session_start && session_destroy надо вызывать до вывода любого контента… или использовать буферизацию.
3.а) Соответственно клиент обратившись на сервер передает куки установленные этим сервером… по этому сервер считывает файл по эому ИД и выдает инфу клиенту
4) насчет переписи кода, то непонятно что нужно в итоге сделать
Но если просто улучшить, то:
4.1) поставить проверку переменной $_GET['some_Str_value'], после чего использовать экранирование в запросе.
4.2) вместо «...» в функции я бы написал assoc => mysql_fetch_assoc
4.3) т.к это дело можно закешировать дальше, то лучше бы, чтобы вывод в цикле дописывался в переменную, а потом она показывалась:
$r='';
while($row=mysql_fetch_assoc) $r.=$row['field'].«

»;
// теоретически тут удобнее закешировать
echo $r;

5) зло запроса в %. Я особо не вдавался в трдности и у меня не висло при таких запросах по-этому сформулировать ответ грамотно не смогу
6) pconnect после окончания скрипта не сносит сцыль на базу. по-этому при последующем вызове рнр выдаст ему этот сцыль… соль поидее может случится когда много будет коннектов… и например 2 копии сделали insert одно временно и вызвали last_id… по идее оно двоим должно вернуть одинаковый ИД… но опять же. .я с этим не работаю, использую pdo по этому трудно сказать, гадать не вижу смысла.

7) если такие объемы будут, то прежде всего нужно начать с архитекруты системы… т.е настройка front-end back-end, балансировщик загрузок, как будут располагатся кеш- сервера, бд-сервера, отдельно как будет спроектирована под система непосредстевенно файлов видео, имеет смысл подумать над протоколом передачи между серверами… т.е например видео можно слать по udp ну и так далее… после чего начать отдельно углублятся… а после будут рождатся классы, связи, сущности, которые нужно постепенно делать… довольно большая тема highload… делать надо с умом и так на коленке это не объяснишь… хз:)

--
вот такой вот мой отвэт)) принимаете на работу, шэф? :)
highw   14 июня 2009 16:15 Комментировать может только авторизованный пользователь
:) 0 :( #
результаты через неделю ;-)
Sych Sych   14 июня 2009 17:03 Комментировать может только авторизованный пользователь
:) 0 :( #
А что будет через неделю?
highw   14 июня 2009 17:27 Комментировать может только авторизованный пользователь
:) 0 :( #
ну может еще кто свои варианты ответов, пусть недельку интрига побудет.
Sych Sych   14 июня 2009 18:10 Комментировать может только авторизованный пользователь
:) 0 :( #
А отвечать можно всем или подождать еще для интриги? :)
GeeK GeeK   16 июня 2009 10:10 Комментировать может только авторизованный пользователь
:) 0 :( #
тебе уже поздно на такие детские вопросы отвечать ;-)
Sych Sych   16 июня 2009 10:11 Комментировать может только авторизованный пользователь
:) 0 :( #
А мне можно ответить, или это будет грусно?
BeGeMoT BeGeMoT   25 июня 2009 12:38 Комментировать может только авторизованный пользователь
:) 0 :( #
Как то на некоторые вопросы особо не обращал внимания.

1. Знаю что к Apache возможно подключить свое приложение как модуль, но более чем приложение test.c не писал.
Все что надо знать для PHP написано в manual-е.
www.php.net/manual/ru/security.php

2. Имеет ли это какое-то принципиальное значение? Заинтересовало. :) Что я могу сказать — не принципиально, так как в 1999 году веб в России еще не вылез из пеленок. А сейчас, это выглядит как вопрос: В чем разница в вызове функций в Pascal и С.

3. Вполне нормально освещен highw выше. SessionID.

4. Скрипт не безопасен, так что SQLInjection как 2+2 сделать. Нет проверки полученного результата. А дальше конечно как сказал highw данные в переменную и используй где пожелаешь.

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

$ar_obj = mssql_fetch_array( $result );

foreach ($ar_obj as $row) {
}

5. Запросы с LIKE часто не писал. Вопрос скорее всего будет стоять в использовании индексов. Если к примеру взять строку поиска, я бы просто бы попытался избежать запроса типа LIKE.

6. Читаем мануал. ua2.php.net/function.mysql-pconnect. Возможные проблемы 1. Кол-во возможных подключений 2. Блокировки 3. Правильно закрывать соединение. Большая часть написана в комментариях.

7. 1. На чем пишем 2. Узкие места 3. Как я могу срубить на этом бабла :)

Tracker   14 июня 2009 21:28 Комментировать может только авторизованный пользователь
:) 0 :( #
Tracker, как говорил один из основателей Digg'a когда речь идет о таких системах не принципиально важно на каком языке написано… Т.е вместо того чтобы оптимизировать код, лучше оптимизировать архитектуру…
highw   14 июня 2009 22:38 Комментировать может только авторизованный пользователь
:) 1 :( #
думаю уже можно отвечать?

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

Откуда PHP знает что лежит в куках — механизм передачи данных в cookies ?
куки передаются через хидер запроса браузера, интерпретатор php парсит их и заносит в свой массивчик.

Почему такой запрос будет тормозить, в чем зло такого запроса, как лечить ?
а зло в том, что нет LIMIT в выборке.


$sql = 'SELECT * FROM table WHERE col=\''.mysql_escape_string($_GET['some_string_value']).'\'';
про инжект сказали, а про ошибку в запросе никто ;)

$result = mysql_query($sql);
нет обработки ошибок

Вам как разработчику ставится сверх задача
поиск провайдера, который сможет все это вытянуть, а остальное — это дело техники, ведь такие заказы новичкам не даются, верно?
WebAngel   19 июня 2009 18:12 Комментировать может только авторизованный пользователь
:) 1 :( #
а зло в том, что нет LIMIT в выборке.
Логично.

Tracker   19 июня 2009 20:27 Комментировать может только авторизованный пользователь
:) 0 :( #
И так неделя прошла - подводим итоги.

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

Проводить собеседования в нашей стране умеют очень небольшое количество людей а работадателей в сотни раз больше - нормальное собеседование может длится от часа и провести его это исскуство которое оттачивается годами.

С заданием в большинстве случаев справились - но самый непонятный вопрос про протокол http 1.1 раскрыт не был - а суть такова что приумали новую версию протокола для поддержки виртуальных хостов, вспомните поле hostnamе в заголовках.

Вопрос по SQL вопросам придуман для выявления знаний о том как работает база данных в частности исползование индексов, (при %% индексы не используются).

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

Что надо было дописать ?

Экранирование данных - intval() || mysql_escape_string в зависимости от того что ждем в скрипте.

После запуска запроса обязательно проверить на то что запрос нормально выполнился - без ошибок в случае возникновения ошибки обработать ситуацию.

Проверить на то что мы получили ожидаемые данные () - а не ноль строк в результате. Зачем зря напрягать машину если ничего не вернулось.

Далее выгребаем данные - способ не важе в переменную или в браузер ;-)

После обработки данных mysql_free_result - освобождаем ресурсы.

Закрываем соединение - mysql_close().

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

Почти все ответы были рядом с тем что хотелось услышать - а хотелось услышать вот что

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

Ну вот вроде бы все ;-) - флейм приветствуется ;-)))))
Sych Sych   21 июня 2009 13:55 Комментировать может только авторизованный пользователь
:) 0 :( #
1) Закрываем соединение — mysql_close(). — А зачем? Если там действительно конец скрипта то оно само закроется по завершению его роботы, а если нет то мы его и не открывали тот кто открыл наверно ж знал зачем он это делал и зачем-то не закрыл, и не дай бог ктото после нас тож его также пользует что нам тогда будет за такую оптимизацыю=)...
2) Проверить на то что мы получили ожидаемые данные () — кхм может я чегото не допонял но while ($row = mysql_fetch_...) чем не проверка? 1иф грубо говоря… Если вы собрались делать ещо 1, то ето глупость так как вы сэкономите 1 раз при ошыбке, а будете делать каждый раз при исполненни...
3) То что при %% не используются индексы и ежу понятно. А что толку если нужно выбрать «содержащие слово» (навесить поисковую машыну ет конешно гениально, но больно хлопотно). А ктото ещо советовал '%'вначале убрать — ивените, Вы логику запроса поменяли — так поступать нельзя. Лимит навесить ет конешно хорошо, но опять таки, теряется логика — я просил показать ВСЕ запросы, а не первых 5…
4)$_GET['some_string_value']Экранирование данных — intval() — кхм, для начала нужно найти и слегка пнуть того кто передал переменную с таким названием ожыдая что ето инт =)
5) по поводу сверх задачи. А зачем ставить такие задачи формулируя их как «построить видео хостинг», если Вы хотите получить ответ — «дак ютуб же есть»… 1я задача по архитектуре, дальше по языку для задач (всетаки я щитаю глупостью писать интерфейс на сях а сервер на яве когда их применение по спецыфикацыи как раз обратное), потом конкретные под-задачи…
kardashuk   5 октября 2009 17:55 Комментировать может только авторизованный пользователь
:) 0 :( #
Вопрос по SQL вопросам придуман для выявления знаний о том как работает база данных в частности исползование индексов, (при %% индексы не используются).
Ну так, а что ты предлагаешь, как лечить?

Первое что надо сделать когда вы получаете какую либо задачу — надо посмотреть (найти) аналоги, может вас заставляют делать то что совершенно никому не нужно.
Как по мне так постановка вопроса не верная. Разработчик (темболее не манагер) не решает нужно это делать или нет: он делает.
А решают нужно ли это делать аналитические и консалтинговые отделы (фирмы).
WebAngel   21 июня 2009 15:51 Комментировать может только авторизованный пользователь
:) 0 :( #
Лечить %% можно многими способами - начиная от того что бы вообще так не составлять запрос и до прикручивания движка для полнотекствого поиска - дело не в том как - а ПОЧЕМУ ;-)) это плохо.

По второму вопросу - тут согласен может сильно феерически звучит вопрос - но все же если применить его к реалиям то получается все очень просто - например вас просят (заставляют) разработать фреймворк и вы сразу сядете писать ???
Sych Sych   21 июня 2009 21:06 Комментировать может только авторизованный пользователь
:) 0 :( #
дело не в том как — а ПОЧЕМУ ;-)) это плохо.
ну так в задании нужно было предложить вариант лечения...

например вас просят (заставляют) разработать фреймворк и вы сразу сядете писать ???
если заказ внешний — да, нам то какая разница?
А если инициатива внутреняя, то конечно все зависит от конторы, если она небольшая, где право голоса имеют все, а не только манагеры, то конечно, можно оспорить. А если программеру дали готовую uml, то нада понимать, что на верху уже всё решили и учли все за и против.
WebAngel   22 июня 2009 18:41 Комментировать может только авторизованный пользователь
:) 0 :( #
как бы не объективно… главное в 1.1 это хостнайм? Ок, в твоих задачах ок, в других это не важно а важно не закрывать соединение.

в общем трактовать тут можно по разному и повезет тому кто мыслит так как и ты, что в общем случае не верно и не показатель:)
highw   23 июня 2009 00:50 Комментировать может только авторизованный пользователь
:) 1 :( #
Перепешите данный кусок кода на ваш вкус и цвет -
В этом коде в цикле на екран выводиться само условие поиска информации — кому это надо, для чего? Мы ж его и так знаем
kano_nir   9 июля 2009 17:03 Комментировать может только авторизованный пользователь
:) 0 :( #
Прикольный пост Sych :)
А скока вы платите товарищам которые имеют такой средний уровень? (ежели не секрет фирмы)
san   23 июля 2009 15:17 Комментировать может только авторизованный пользователь
:) 0 :( #
Не такие и серьезные вопросы чтобы много платить имхо )
nomeNNescio   12 августа 2009 18:24 Комментировать может только авторизованный пользователь
:) 0 :( #
а они не платят :)
taptak   25 августа 2009 13:20 Комментировать может только авторизованный пользователь
:) 0 :( #
Только зарегистрированные пользователи могут оставлять комментарии.
© 2008 | О сайте | Инструкции | Обратная связь
© Powered by BigStreet

Работа с БД:
 Время - 0.0028
 Запросов - 3
Работа с кэшем:
 Время - 0.0038
 Записей - 0
 Прочтений - 5
Общее время:
 0.0925