Я только что установил свое первое удаленное соединение с FileMaker Server, используя PHP API, и происходит что-то немного странное.
Первое соединение и ответ занимает около 5 секунд, если я сразу же после нажатия кнопки перезагрузки получаю ответ в течение 0,5 секунды.
Я могу получить быстрый ответ в течение примерно 60 секунд или около того (пока не рассчитано, но кажется, что это не менее минуты, но не более 5 минут), а затем возвращается 5 секунд, чтобы получить ответ. (после этого снова быстро)
Есть ли способ гарантировать, что это всегда быстрый ответ?
Я не могу дать вам точный ответ о том, откуда может возникнуть разница в скорости, но я бы согласился с понятием NATH о кэшировании. Вероятно, это связано с тем, как FileMaker Server обрабатывает кэширование результатов на стороне сервера и когда очищает этот кэш.
В дополнение к этому, пара вещей, которые полезно знать при использовании пользовательских веб-публикаций с FileMaker, когда дело касается скорости:
Когда вы выполняете поиск в PHP API по определенной раскладке, например:
$request = $fm->newFindCommand('myLayout');
$request->addFindCriterion('name', $myname);
$result = $request->execute();
Возвращаются данные со всех полей, доступных на my layout
раскладка.
В терминах SQL, приведенный выше запрос эквивалентен:
SELECT * FROM myLayout WHERE `name` = ?; // and the $myname variable is bound to ?
Поиск FileMaker вернет все доступные поля / столбцы. Вы определяете возвращаемые столбцы, размещая нужные поля в макете. Чтобы получить правду *
выберите все из таблицы, вы бы включили все поля таблицы в свой макет.
Все это говорит о том, что вы можете ускорить свои запросы, включив только поля в макете, которые вы хотите вернуть в запросах. Если вам нужны данные только из 3 полей, возвращаемых вашему php, чтобы выполнить работу, включите только эти 3 поля в макет, который используют запросы.
Используя приведенный выше пример, если вы знаете, что вам нужно внести изменения в эти записи где-то внизу строки в вашем php, сохраните записи в переменной и используйте setField
а также commit
методы их редактирования. например.:
$request = $fm->newFindCommand('my layout');
$request->addFindCriterion('name', $myname);
$result = $request->execute();
$records = $result->getRecords();
...
// say we want to update a flag on each of the records down the line in our php code
foreach($records as $record){
$record->setField('active', true);
$record->commit();
}
Поскольку у вас уже есть записи, вы можете использовать их и при необходимости фиксировать.
Я говорю это вместо того, чтобы захватить их один раз для одной цели, а затем снова извлечь их из базы данных, а потом вносить изменения в записи.
Это не совсем ответ на ваш первоначальный вопрос, но, поскольку API FileMaker немного отличается от других, и у него нет лучшей документации, хотя я бы упомянул об этом.
Есть некоторые задержки, которые вы можете устранить.
Убедитесь, что макеты, к которым вы получаете доступ через PHP, очень просты, нет ненужных или медленных вычислений, мало объектов макетов и т. Д. Когда механизм PHP впервые обращается к этому макету, он должен загрузить его.
Также проверьте наличие триггеров макета и сценария файла, которые могут быть запущены. IIRC триггер сценария OnFirstWindowOpen вызывается при установлении соединения.
Я не думаю, что это связано с кэшированием. Кроме того, то же самое при доступе через XML. Не проверял ODBC, но я предполагаю, что это тоже проблема.
Как только соединение установлено с FileMaker Server и вашим компьютером, FileMaker Server поддерживает это соединение в течение примерно 3 минут. Вы можете увидеть соединение в списке клиентов в консоли администратора FM-сервера. Первоначальное подключение занимает несколько секунд, чтобы установить (в зависимости от того, сколько других подключено), а затем ЛЮБЫЕ дальнейшие запросы молниеносно. Если вы снова запустите приложение, оно будет повторно использовать это соединение и даст результаты за очень короткое время.
Вы можете выполнять совершенно разные запросы (для разных таблиц) в другом приложении, но если вы выполняете второй запрос на том же компьютере и используете те же учетные данные, FileMaker Server будет повторно использовать существующее соединение и мгновенно предоставлять результаты. Это означает, что это происходит не из-за кэширования, а из-за того, что FMServer сначала устанавливает соединение.
В нашем случае мы используем веб-сервер для вызовов API-интерфейса FileMaker PHP. Мы установили cron каждые 2 минуты, чтобы поддерживать связь, что в значительной степени устранило все задержки.
Наверное, уже слишком поздно, чтобы ответить на этот вопрос, но я пишу здесь на случай, если кто-то еще увидит это.
Я видел это при использовании внешней аутентификации с FileMaker Server. Первый запрос устанавливает соединение с Active Directory, что занимает некоторое время, а затем последующие запросы выполняются быстро, поскольку FMS выяснила аутентификацию. Если вы можете, используйте локальную аутентификацию в своем файле FileMaker для доступа к PHP и убедитесь, что она находится выше любой внешней аутентификации в вашем списке учетных записей. FileMaker запускает список авторизации сверху вниз, поэтому это гарантирует, что FMS успешно аутентифицирует ваш веб-запрос, прежде чем попытается выполнить запрос на внешнюю аутентификацию, что сделает процесс аутентификации очень быстрым.