[]
. Обычно нет никакой проблемы при использовании $ str [0]
(и я уверен, что это намного быстрее, чем метод substr ()
). Существует только одна оговорка с обоими методами: они получат первый байт , а не первый символ . Это важно, если вы используете многобайтовые кодировки (например, UTF-8). Если вы хотите поддержать это, используйте mb_substr ()
. Возможно, вы всегда должны принимать многобайтовый вход в эти дни, так что это best , но он будет немного медленнее.
Ошибка на самом деле не исходит от MySQL, но из самой Windows :
Когда соединение закрыто, на стороне, которая закрывает соединение, 5 кортежей {протокол, локальный IP-адрес, локальный порт, удаленный IP-адрес, удаленный порт} по умолчанию переходит в состояние TIME_WAIT в течение 240 секунд.
В этом случае протокол фиксирован - TCP
Локальный IP-адрес, удаленный IP-адрес и удаленный PORT также обычно фиксируются. Таким образом, переменная является локальным портом.
Случается, что когда вы не привязываете порт в диапазоне 1024-5000, используется. Так что примерно 4000 портов. Если вы используете их все за 4 минуты - это означает, что примерно за каждые 4 минуты вы совершаете 16 запросов веб-сервисов в секунду, вы исчерпаете все порты. Это и есть причина этого исключения.
blockquote>Другими словами, у вас закончились порты в динамическом диапазоне. Это, вероятно, не должно происходить. Сколько одновременных пользователей вы имеете в виду здесь?
Связанный блог имеет обходные пути:
- Увеличить диапазон динамического порта путем редактирования реестра.
- Уменьшите время, в течение которого система хочет подключиться к
TIME_WAIT
, через редактирование реестра.- Запустите немного кода, чтобы сделать вышеупомянутое изменение реестра без regedit.
Какое большое количество обходных решений!
См. также этот вопрос на форумах Visual Studio , в котором объясняется:
Порт будет заблокирован еще на минуту или две, чтобы поймать все пакеты, которые могли быть отправлены до того, как приложение было прекращено, но еще не пришло. В Winsock API вы можете установить параметр SO_REUSEADDR сокета для его разрешения (также этот параметр можно установить в классе .NET Socket), но TcpListener слишком высокоуровневый и не позволяет вам установить этот параметр.
blockquote>Очень вероятно, что базовый код для подключения к MySQL или код, который обрабатывает соединения в Apache, не пытается использовать
SO_REUSEADDR
.Я сделав ставку на то, что ваше изменение тайм-аута keepalive оказало прямое влияние. Несмотря на то, что теоретическое уменьшение теоретически освобождает сокет, Windows не соглашается и сохраняет зарезервированный сокет.
вы можете изменить окна REGISTRY
, чтобы исправить это,
сначала в regedit открыть этот путь:
HKLM \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
и создать 4 новых DWORD
в качестве этой клавиши и значения:
TcpTimedWaitDelay
REG_DWORD: 0000001e (hex)
MaxUserPort
REG_DWORD: 0000fffe (hex)
TcpNumConnections
REG_DWORD: 00fffffe (hex)
TcpMaxDataRetransmissions
REG_DWORD: 00000005 (hex)
как с этим снимком экрана:
На этом есть простая работа.
Загрузить CurrPorts http://www.nirsoft.net/utils/cports.html - автономный бесплатный инструмент, который перечисляет какие программы и службы используют порты. Конечно, вы можете использовать netstat, средства администрирования Windows и диспетчер задач, чтобы понять это сами, но CurrPorts делает это для вас.
Запуск Currports as administrator >> Выберите службу / приложение, создающее проблему перейдя в тот же порт >> Остановите службу. Чтобы остановить службу -
Надеюсь, вы поднимете меня опросом.
FWIW, у меня была такая же проблема с аналогичной настройкой (Windows XP). Тот же код работал без этой проблемы на Mac (OS X).
Я решил проблему, используя постоянное соединение в классе MySQLi.
См. Здесь для получения дополнительной информации: http://php.net/mysqli.persistconns
Убедитесь, что вы знаете обо всех ошибках / предостережениях, связанных с использованием постоянного соединения.
Случается со мной при разработке моих проектов Laravel. В целях развития, это не biggie особенно, когда вы используете систему Windows. Но для производства я просто запускаю Linux и проблема решена. Также, если возможно, измените соединение MySQL с «localhost» на «127.0.0.1».
netsh int ipv4 show dynamicport tcp
. – JSmitty 20 January 2015 в 16:23