Results 1 to 6 of 6

Thread: User logins - PHP SQL - race conditions?

  1. #1
    Join Date
    Oct 2013

    User logins - PHP SQL - race conditions?

    Hi I'm new to this forum and relatively new to PHP / SQL.

    My question is, in general, does SQL with PHP cause any race conditions?

    eg. If a user navigates to a page that executes some SQL such as logging in /registering to a site, the server runs that script right? What would happen if two, three, or even a hundred people are all trying to register at the same time? If the server is halfway through one of the scripts, would the next user interrupt this and cause the server to execute it from the start?

    How do large sites usually handle logins / register scripts to avoid this? I know about threads but afaik PHP doesn't allow multiple threads.

    Thanks for reading.

  2. #2
    Join Date
    Feb 2013
    I imagine they perform SQL_CONSTRAINT_VIOLATION (or some kind of constraint check if it is a different database) checks to make sure there are no collisions (people entering the same username for example at the same time).

  3. #3
    Join Date
    Aug 2004
    Usually the only potential race condition for a registration system would be separate users trying to use the same user ID and/or email address. If you define that field as unique in the relevant DB table, as alluded to above you can simply test for the relevant constraint error (MySQL error number 1062). Then when you run your insert query, if it fails, check the mysql_errno() or mysqli_errorno() (hopefully you're using the latter?), and if it's a 1062 then let the user know that ID is already taken.
    "Well done....Consciousness to sarcasm in five seconds!" ~ Terry Pratchett, Night Watch

    How to Ask Questions the Smart Way (not affiliated with this site, but well worth reading)

    My Blog
    cwrBlog: simple, no-database PHP blogging framework

  4. #4
    Join Date
    Oct 2013
    Thanks for the response. Yeah, I have a check for ID column that's unique.

    Still a little hazy on the details.

    Lets say there is a script that takes 3 seconds to complete.

    0 sec - User 1 navigates to script
    1 sec - User 2 navigates to script
    2 sec - User 3 navigates to script
    3 sec - User 1 script complete?

    What would happen in this situation? Does the server finish executing User 1 before it starts User 2; so User 2 and 3 have to wait a long time?
    Does User 3 interrupt the previous ones? Or does the server execute them like threads?

  5. #5
    Join Date
    Aug 2004
    The actual sequence of events may vary depending on server OS, number of CPUs, (number of servers if using a load balancer), type of web server and PHP installation, and so forth.

    Generally speaking, each request will run in its own process and memory space and won't care about any other requests. (While an individual PHP script may not be able to multi-thread, that does not mean the web server cannot spawn multiple, independent PHP processes.) Probably the only times they will have any sort of conflicts will be when hitting the database or during file I/O, and that's usually not an issue unless they are both trying to write to the same DB row or the same file. A DBMS usually handles simple cases of this just fine without you having to worry about it, though in more complex situations you may need to implement some DB transaction processing with table/row locking. (I think I've used transactions once in the past year, and don't remember when I last did any explicit DB table locking. I think I had to implement some file-locking once in the past year or 2, as well.)
    "Well done....Consciousness to sarcasm in five seconds!" ~ Terry Pratchett, Night Watch

    How to Ask Questions the Smart Way (not affiliated with this site, but well worth reading)

    My Blog
    cwrBlog: simple, no-database PHP blogging framework

  6. #6
    Join Date
    Oct 2013
    Ah, thanks NogDog for clarifying this for me

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
HTML5 Development Center



X vBulletin 4.2.2 Debug Information

  • Page Generation 0.13311 seconds
  • Memory Usage 2,881KB
  • Queries Executed 13 (?)
More Information
Template Usage (32):
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_global_above_footer
  • (1)ad_global_below_navbar
  • (1)ad_global_header1
  • (1)ad_global_header2
  • (1)ad_navbar_below
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)ad_thread_first_post_content
  • (1)ad_thread_last_post_content
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)headinclude_bottom
  • (6)memberaction_dropdown
  • (1)navbar
  • (4)navbar_link
  • (1)navbar_moderation
  • (1)navbar_noticebit
  • (1)navbar_tabs
  • (2)option
  • (6)postbit
  • (6)postbit_onlinestatus
  • (6)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available (6):
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files (26):
  • ./showthread.php
  • ./global.php
  • ./includes/class_bootstrap.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/functions_navigation.php
  • ./includes/class_friendly_url.php
  • ./includes/class_hook.php
  • ./includes/class_bootstrap_framework.php
  • ./vb/vb.php
  • ./vb/phrase.php
  • ./includes/functions_facebook.php
  • ./includes/functions_calendar.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_notice.php
  • ./packages/vbattach/attach.php
  • ./vb/types.php
  • ./vb/cache.php
  • ./vb/cache/db.php
  • ./vb/cache/observer/db.php
  • ./vb/cache/observer.php 

Hooks Called (70):
  • init_startup
  • friendlyurl_resolve_class
  • init_startup_session_setup_start
  • database_pre_fetch_array
  • database_post_fetch_array
  • init_startup_session_setup_complete
  • global_bootstrap_init_start
  • global_bootstrap_init_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • load_show_variables
  • load_forum_show_variables
  • global_state_check
  • global_bootstrap_complete
  • global_start
  • style_fetch
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • strip_bbcode
  • friendlyurl_clean_fragment
  • friendlyurl_geturl
  • forumjump
  • cache_templates
  • cache_templates_process
  • template_register_var
  • template_render_output
  • fetch_template_start
  • fetch_template_complete
  • parse_templates
  • fetch_musername
  • notices_check_start
  • notices_noticebit
  • process_templates_complete
  • friendlyurl_redirect_canonical
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • memberaction_dropdown
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • build_navigation_data
  • build_navigation_array
  • check_navigation_permission
  • process_navigation_links_start
  • process_navigation_links_complete
  • set_navigation_menu_element
  • build_navigation_menudata
  • build_navigation_listdata
  • build_navigation_list
  • set_navigation_tab_main
  • set_navigation_tab_fallback
  • navigation_tab_complete
  • fb_like_button
  • showthread_complete
  • page_templates