2016-12-19 2 views
0

Мой скрипт PHP читает заданный пользователем URL CSV и записывает данные в базу данных mysql, и пользователь может видеть его данные в веб-интерфейсе. Поля таблицы будут удалены с новым запросом. Это работает очень хорошо - но:Заставить PHP ждать завершения другого запроса?

Если 2 (или более) пользователя запросят собственный URL-адрес CSV одновременно, иногда они не получают собственных данных (они получают данные таблицы из процесса раньше). Есть ли способ заставить пользователя «ждать» или «ждать» до завершения другого запроса?

Надеюсь, вы его получите. Благодарим вас за любые предложения.

+0

Похоже, ваша программа слишком долго держит данные, вызывая блокировки чтения. Необходимо изменить базу данных и программную инфраструктуру для более эффективной работы с данными. То есть, гарантируя, что данные ** уникальны ** для этого пользователя и не удерживаются на данных слишком долго. Справедливо, так что @GordonM упомянул - его важные для * перекрестных ссылок * таблицы! – KDOT

+1

Если каждый запрос получает уникальный идентификатор, вы можете иметь несколько одновременных запросов, которые не перезаписывают друг друга. Это может быть сделано с помощью таблицы запроса с идентификатором автоинкремента, который создается в начале запроса, и таблицы requestData для каждого элемента в CSV, который должен быть обработан, с дополнительным столбцом, содержащим идентификатор в таблице запроса, сгенерированной для этого запроса , – GordonM

+0

Недостаточно информации! Нам нужно было бы увидеть какой-то код, прежде чем мы могли бы дать достойный ответ. Это может быть вызвано столь многими переменными, что просто невозможно охватить все в одном ответе. – Dragos

ответ

1

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

Если вы меня поняли, у вас есть форма, которая отправляет URL-адрес (текстовое поле); когда PHP запускает этот URL-адрес в php и содержимое, помещенное в базу данных. Затем база данных отображается в html и возвращается как результат формы - или что-то в этом роде. И когда два человека делают это в одно и то же время, все смешивается, потому что они оба используют одни и те же имена таблиц.

Если я правильно понял, приложение должно либо:

  • использовать имена таблиц с префиксом что-то конкретное для пользователя - например, их имя пользователя или что-то подобное.
  • использовать некоторый механизм блокировки на сервере, чтобы принудительно выполнялась очередь «один на один». Я думаю, что это то, о чем вы просили ...

Я не уверен в этом - будь то учебное упражнение или что-то еще, но избегайте одноразовых solutiuon: нелегко заставить его работать правильно, и это не так, как работает «Интернет» в целом.

Используя имя таблицы префиксов бы что-то вроде:

  • решения о методе, чтобы отличить каждый пользователь: возможно, вы можете использовать таблицу с идентификатором строки автоинкремента и используются строка идентификатор? Возможно, у вас есть сеансы входа в систему и вы можете использовать имя входа. Убедитесь, что в идентификаторе, используемом для таблиц, используются только «простые» символы: например, отфильтруйте все, кроме ASCII букв и цифр, с помощью preg_replace().

  • Где вы создаете таблицу с постоянным именем, добавьте новый 'идентификатор' в том, что:

    $sql = "create table csv (" . $fields . ")"; 
    

    становится:

    $sql = "create table csv" . $id . " (" . $fields . ")"; 
    

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

+0

Спасибо @rivimey. Префикс с таблицами для каждого пользователя отлично работает для моих нужд. У меня есть 50 «знающих клиентов», поэтому это работает отлично. :) – Roman