ajax-вызов разделителя строк

Таким образом, файл PHP возвращает строку (для вызова ajax) следующим образом:

$output = $sessID."###".$sessEmail."###".$sessFirstName."###".$sessLanguage."###".$sessRememberMe;

и в javascript я делаю:

    if (reply.indexOf("###") >= 0) {
    arrayReply = reply.split("###");
    user.ID = arrayReply[0];
    user.Email = arrayReply[1];
    user.FirstName = arrayReply[2];
    user.Language = arrayReply[3];
    user.RememberMe = arrayReply[4];
    }

проблема может возникнуть, когда части ответа содержат разделитель, который я использую "###". Что я могу сделать в такой ситуации? На мой взгляд, делать разделитель более сложным/редким - это не решение.

PS: я пробовал JSON, но это НАМНОГО МЕДЛЕННЕЕ на стороне сервера.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ:

JSON на стороне сервера медленнее, и то же самое на стороне клиента, однако это не будет узким местом (430 мс для 100 000 вызовов), и, кроме того, нет необходимости, как сказал Джулс ниже, заново изобретать колесо. Было еще одно решение: bin2hex() в php [что сократило время с 430 мс до 240], а затем вернуть строку в javascript с помощью функции hex2string, однако это не стоит усилий. JSON это. Спасибо вам всем!


person MirrorMirror    schedule 04.05.2012    source источник
comment
почему бы вам просто не отправить эти значения из php в формате json или xml   -  person Dhiraj    schedule 04.05.2012
comment
JSON имеет гораздо больше смысла в этой ситуации. Однако, если вы настаиваете на типе CSV, довольно часто используются дополнительные разделители полей, такие как '', и убедитесь (т.е. замените), что они не отображаются в полях значений.   -  person Jules    schedule 04.05.2012


Ответы (4)


Вы можете использовать json.

http://php.net/manual/en/function.json-encode.php

Как декодировать элементы массива JSON в JavaScript?

person Nauphal    schedule 04.05.2012
comment
Я попробовал JSON, однако обнаружил, что это НАМНОГО МЕДЛЕННЕЕ, чем простое объединение строк и разбиение на массивы: на стороне сервера: в 6 раз медленнее, на стороне клиента (не так важно) в 5-9 раз медленнее. - person MirrorMirror; 04.05.2012
comment
В это трудно поверить. Очевидно, что весь процесс будет немного медленнее, но 6 раз звучит много. Кроме того, я не понимаю, как это может быть проблемой в реальном мире. Если у вас такие жесткие требования к производительности, почему вы вообще используете PHP? :С - person Jules; 04.05.2012
comment
Я сделал тесты с 100 000 звонков. json было 435 мс, а простое объединение - 72 мс, это в 6 раз больше на стороне сервера. - person MirrorMirror; 04.05.2012
comment
Собственно, почему это проблема? Вы все равно окажетесь в этой области, как только начнете дезинфицировать струны. Не пытайтесь заново изобретать велосипед, вы столкнулись с одной из проблемных областей, для которых были изобретены правильные форматы сериализации (такие как XML или JSON). - person Jules; 04.05.2012
comment
Я думаю, вы правы, мне пришлось бы повторно реализовать JSON, и 435 мс для 100 000 вызовов не проблема, я сомневаюсь, что у меня будет 100 000 одновременных пользователей. P.S. вы сказали, что PHP обычно медленный, что бы вы предложили в качестве более быстрой альтернативы? - person MirrorMirror; 04.05.2012
comment
Ну, во-первых, я сомневаюсь, что ваш http-сервер будет очень хорошо обрабатывать 100 000 одновременных запросов AJAX. Я бы не осмелился предложить какую-либо альтернативу, так как понятия не имею, о чем проект и каковы общие требования. Я имел в виду, что если вас беспокоят несколько циклов ЦП, вы, вероятно, обратите внимание на какое-то высокооптимизированное решение CGI, а не на интерпретируемый PHP-код. В любом случае, я полагаю, что с точки зрения производительности PHP подходит для 98% веб-проектов, для которых он используется. - person Jules; 04.05.2012

Если, как вы говорите, кодирование в формате JSON медленнее, чем вы могли бы попробовать следующее,

$output = '"' . some_kind_of_escape_function($sessID).'","'.some_kind_of_escape_function($sessEmail).'","'.some_kind_of_escape_function($sessFirstName).'","'.some_kind_of_escape_function($sessLanguage).'","'.$sessRememberMe.'"';

и, конечно же, замените some_kind_of_escape_function соответствующей функцией php (например, addlashes или mysql_real_escape_string). Прошло некоторое время с тех пор, как я занимался разработкой PHP, поэтому выберите тот, который лучше всего соответствует вашим потребностям.

Тогда это простой случай разделения запятой и удаления кавычек

person kzhen    schedule 04.05.2012

Один из вариантов — использовать вместо этого объект JSON.

Для PHP (с использованием json_encode):

$output = json_encode(array(
    "sessid" => $sessID,
    "sessEmail" => $sessEmail,
    "sessFirstName" => $sessFirstName,
    "sessLanguage" => $sessLanguage,
    "sessRememberMe" => $sessRememberMe
));

Для JS (с использованием метода jQuery):

$.getJSON("/path/to/script.php", function(reply) {
    user.ID = reply.sessid;
    user.Email = reply.sessEmail;
    user.FirstName = reply.sessFirstName;
    user.Language = reply.sessLanguage;
    user.RememberMe = reply.sessRememberMe;
});

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

person VisioN    schedule 04.05.2012
comment
Спасибо за ваш ответ, однако JSON очень медленный как на стороне сервера, так и на стороне клиента. на стороне сервера это в 6 раз медленнее, и это важно, я думаю - person MirrorMirror; 04.05.2012
comment
@ user1032650 Как насчет использования \n в качестве разделителя? - person VisioN; 04.05.2012
comment
это было бы хорошим решением, однако я боюсь, что какой бы разделитель я ни использовал, злонамеренный пользователь с помощью javascript также может его вставить. - person MirrorMirror; 04.05.2012
comment
@user1032650 user1032650 Удалите его с str_replace пробелами :) - person VisioN; 04.05.2012
comment
@VisioN \n только смещает проблему, поскольку вы также можете использовать \n в качестве строкового содержимого, не так ли? Или, может быть, вы хотите сохранить символ \n для последующего использования. - person worenga; 04.05.2012
comment
@mightyuhu В идентификаторе сеанса, адресе электронной почты, одной строке имени, языке и bool помните_меня? Я сомневаюсь. - person VisioN; 04.05.2012
comment
в этих полях да, у меня не будет \n, но в других общих сообщениях, таких как текст, могут быть всевозможные символы - person MirrorMirror; 04.05.2012
comment
@ user1032650 Хм, тогда я бы предпочел JSON как самый безопасный метод. Более того, я не думаю, что для мощного сервера есть проблема сделать JSON-строку. В 6 раз медленнее, чем 1 кратная конкатенация, компенсируется, когда вы начинаете заменять и экранировать. В случае JSON клиентская сторона получает действительный объект JavaScript, который не нужно анализировать. Так что, возможно, в веб-технологиях JSON будет даже быстрее, чем другие безопасные методы сериализации/десериализации. - person VisioN; 04.05.2012

Зачем разрабатывать свой формат, если он уже есть? используйте JSON:

$output = json_encode(array('sessionID'=>$sessID,'sessionEmail'=>sessEmail,'sessionFirstName'=>$sessFirstName,'sessLanguage'=>$sessLanguage,'sessRememberMe'=>$sessRememberMe));

А для стороны Javsascript см. http://www.javascriptkit.com/dhtmltutors/ajaxgetpost4.shtml или если вы используете JQuery и т. д., ваша платформа, скорее всего, будет иметь какие-то встроенные функции, такие как http://api.jquery.com/jQuery.getJSON/

Однако, если вы хотите использовать свой ###-разделитель, я предлагаю вам уменьшить его до «#» для простоты и пространства. После этого введите так называемый escape-символ, такой как «\». Итак, в предварительном проходе вы проанализируете свой ввод и замените все вхождения # на #, наоборот в выводе. Затем вы можете разбить свою строку, используя специальное регулярное выражение, которое разбивается только на #, а не на «#».

person worenga    schedule 04.05.2012