Jadual Kandungan
什么是PHP会话?
什么是Ajax?
具体问题
造成的原因
问题的解决方法
总结
Rumah pembangunan bahagian belakang tutorial php 解决AJAX请求使PHP反应时间过长的问题

解决AJAX请求使PHP反应时间过长的问题

Aug 08, 2016 am 09:22 AM
ajax php session start

现在我们开发了很多依赖于Ajax请求的应用,在某些情况下,甚至全部页面都依赖Ajax。有时我们会注意到,当一个网页发送两个或者更多Ajax请求时,PHP的反应时间会很长并会同时返回响应内容。

这个问题很可能是你处理PHP会话的方式造成的,跟着本文去理解这个问题,并做一些处理来避免这个问题。

内容

什么是PHP会话?
什么是Ajax?
具体问题
造成的原因
问题的解决方法
总结

什么是PHP会话?

为了理解这个问题,有必要先了解一下PHP会话和Ajax,以及它们是怎么干扰的。
假设你正在开发一个Web应用,想要识别不同用户。你想要记住是谁每次浏览了所有页面但都没有登录,这种情况下,你可以使用cookies或sessions。
可以你已经意识到了,sessions是一种存储用户信息的方式,它可以在任何页面重新取回用户信息。跟Cookies不同,Sessions是存储在服务器上的,所有用户不能直接改变这些信息。
默认情况下,Sessions在用户关闭浏览器之前均有效,或者用户在PHP配置文件中指定的时间内没有活动之后才失效。
在PHP页面中,无论你什么时候想要存储或者重新获取用户数据,都必须在页面开始处调用session_start(),因此才有权限使用$_SESSION去获取session数据。

什么是Ajax?

Ajax代表 Asynchronous JavaScript and XML,它是一种不用重新加载整个页面就能向服务器发送数据和从服务器接收数据的方式。
我们使用这种方式来发送数据,并以较快的速度从服务器检索数据。我们不用得到整个页面并在浏览器中渲染它,因为这是很慢的。
因此,我们可以更新网页的一部分,并且用户是可以看见这种改变的,就像用户向下滚动Facebook的时间线页面来看他们想看的东西,随着新内容添加而不用重载整个页面。

具体问题

开发几乎100%基于Ajax的Web应用已经不是一件新鲜事了,但是当一个网页同时发送两个及以上的Ajax请求时,你会注意到请求会花费很长时间,并且几乎在同一时刻完成了请求。

造成的原因

当你想服务器发送一个Ajax请求时,PHP脚本也开启了session_start(),它的调用会锁定PHP的session文件。
你可能已经知道,PHP默认会把session数据存储在服务器上的文件中。因为仅仅只有一个PHP请求能改变同一个session文件,两个同时的PHP请求可能会造成典型的文件锁条件,因此,任何一个其他由PHP调用的对于同一个用户的session_start()请求将不得不等到第一个请求结束。
现在,大部分PHP框架会首先在主文件中使用session_start()。因此,如果你正在使用会调用session_start()的框架或者函数库,将会造成session文件锁,对于使用同一个浏览器的相同用户,这将延迟同时发送的Ajax请求。

问题的解决方法

调用session_write_close()函数会使PHP写入session文件并关闭它,因此释放session文件后,另一个请求就有权限写入。
调用session_write_close()之后,当前脚本会继续正常运行,但你应该清楚在调用session_write_close()之后不允许改变任何session变量;在同一个脚本中,其它同时发送给PHP的请求可以锁定session文件并改变session变量。
为了让你看到这种问题,我创建了测试代码并将它上传到了github。你可以再这里找到测试脚本。在本地,你需要用一个实例来使用测试代码,然后打开浏览器控制台,查看请求和响应时间。
正如我们在这个文件中看到的示例代码,如果我们像下面代码这样,创建多个请求…

<code><span>session_start()</span>;
<span>sleep(<span>5</span>)</span>;</code>
Salin selepas log masuk

同一个用户的每个请求完成之前都将等到前一个请求完成。它将用时5s,因为知道脚本完成之前,session文件都没有被释放。因此,当第一次调用session_start()时,新的请求将被阻塞。那将杀死异步请求的想法,也就是说,多个请求会在同一时间被发送和被执行。
如果将文件中的代码改一下:

<code><span>session_start()</span>;
<span>// do something useful here</span><span>session_write_close()</span>;
<span>sleep(<span>5</span>)</span>;</code>
Salin selepas log masuk

第三行代码将释放session文件锁,所以另一个并发请求不需要等待就能运行,因为它可以调用session_start()而不会有任何问题。

总结

PHP有些微妙,会让你担心为什么奇怪的事情会发生。但是一旦你理解事情是怎么运行的,一切将变得有意义,并且你能更好的思考去解决问题。

译文出处:http://www.ido321.com/1577.html

本文根据@Eslam Mahmoud的《Fix the AJAX Requests that Make PHP Take Too Long to Respond》所译,整个译文带有我自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://www.phpclasses.org/blog/post/277-Fix-the-AJAX-Requests-that-Make-PHP-Take-Too-Long-to-Respond.html

以上就介绍了解决AJAX请求使PHP反应时间过长的问题,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini 7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini Nov 13, 2024 am 09:42 AM

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

See all articles