Site freezing and errors during multiple user sessions with Scripto

We’ve been starting to host small transcribathon sessions with our Scripto installation on Omeka S (Scripto 1.5.1, Omeka S 4.2.0) on Reclaim shared Organization tier hosting plan. When we have more than a small handful of users (like more than two or three people), the site starts to freeze up with 405 errors, slow page load times, and server unreachable errors.

Most recently we had 8 people working, on different Scripto items, from different states, so not on shared IP addresses. When I reached out to Reclaim, they said it might be caused by an IP making multiple requests quickly back to back, which I don’t think was happening–we were all working on different documents, saving at the end of transcribing a page, and when everyone started getting slow load times/errors, we took turns trying to save on the thought that the site was overloaded with traffic. When I checked our traffic logs, it didn’t look like there was unusual traffic besides the expected for the transcribers. During our transcribathon, the Omeka application logs had multiple errors like this:

Next Laminas\Http\Client\Adapter\Exception\RuntimeException: Unable to enable crypto on TCP connection miaminationarchive.com: make sure the "sslcafile" or "sslcapath" option are properly set for the environment. in /public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php:426

We have an SSL certificate for the site, so I’m not sure what else this error means for us.

Reclaim’s only advice was to make sure that a single IP wasn’t making many frequent requests, which I don’t really think was happening anyway. Is there anything else we can do to prevent this kind of freezeup from happening when we have multiple users working? It’s been a problem with every transcribathon we’ve hosted, even when the users aren’t even in the same state and it’s been making it hard to even train new transcribers because it happens with only 2-3 people working.

Two things worth checking, starting with the first.

Scripto saves transcriptions by contacting MediaWiki from your server, so all of those connections originate from a single IP address: your own. That’s likely what Reclaim was observing.

Your SSL error is one of those connections being cut off partway through being established. Scripto waits 20 seconds on each request, so a dropped connection means the page sits for 20 seconds and then fails, which would account for both the slowness and the errors.

Could you paste the lines immediately above that SSL error? It begins with “Next”, which means there’s an earlier entry that should say more about why the connection failed. That’s the detail worth taking back to Reclaim, and until we know what’s dropping them I can’t suggest much in the way of prevention.

Second, were your transcribers logged into Scripto or working anonymously? MediaWiki caps anonymous edits at 8 per minute across your whole site, since they all appear to come from your server. Logged-in accounts get 90 per minute each, so it’s a straightforward one to rule out.

The 405 errors don’t come from Scripto, so those point to Reclaim’s stack as well.

One fix on my end for the next release: a refused save has been discarding whatever the transcriber had typed. That will no longer happen.

1 Like

All our transcribers work logged in, we don’t allow anonymous edits.

Below are the full error logs during the period we were having trouble:

Stack trace:
#0 [internal function]: Laminas\Stdlib\ErrorHandler::addError(2, 'stream_socket_e...', '/home/miaminat/...', 397)
#1 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php(397): stream_socket_enable_crypto(Resource id #299, true, 121)
#2 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php(355): Laminas\Http\Client\Adapter\Socket->enableCryptoTransport('tls', Resource id #299, 'miaminationarch...')
#3 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client.php(1463): Laminas\Http\Client\Adapter\Socket->connect('miaminationarch...', 443, true)
#4 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client.php(963): Laminas\Http\Client->doRequest(Object(Laminas\Uri\Http), 'POST', true, Array, 'action=query&me...')
#5 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(1027): Laminas\Http\Client->send(Object(Laminas\Http\Request))
#6 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(894): Scripto\Mediawiki\ApiClient->request(Array)
#7 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(172): Scripto\Mediawiki\ApiClient->queryUserInfo()
#8 /home/miaminat/public_html/modules/Scripto/src/ViewHelper/Scripto.php(262): Scripto\Mediawiki\ApiClient->userIsLoggedIn()
#9 /home/miaminat/public_html/modules/Scripto/view/layout/layout-scripto-public-app.phtml(38): Scripto\ViewHelper\Scripto->loginBar()
#10 /home/miaminat/public_html/vendor/laminas/laminas-view/src/Renderer/PhpRenderer.php(585): include('/home/miaminat/...')
#11 /home/miaminat/public_html/vendor/laminas/laminas-view/src/View.php(202): Laminas\View\Renderer\PhpRenderer->render(NULL)
#12 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/View/Http/DefaultRenderingStrategy.php(92): Laminas\View\View->render(Object(Laminas\View\Model\ViewModel))
#13 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(318): Laminas\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Laminas\Mvc\MvcEvent))
#14 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(168): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent))
#15 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/View/Http/DefaultRenderingStrategy.php(110): Laminas\EventManager\EventManager->triggerEvent(Object(Laminas\Mvc\MvcEvent))
#16 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(318): Laminas\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Laminas\Mvc\MvcEvent))
#17 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(168): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent))
#18 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/Application.php(354): Laminas\EventManager\EventManager->triggerEvent(Object(Laminas\Mvc\MvcEvent))
#19 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/Application.php(335): Laminas\Mvc\Application->completeRequest(Object(Laminas\Mvc\MvcEvent))
#20 /home/miaminat/public_html/index.php(26): Laminas\Mvc\Application->run()
#21 {main}

Next Laminas\Http\Client\Adapter\Exception\RuntimeException: Unable to enable crypto on TCP connection miaminationarchive.com: make sure the "sslcafile" or "sslcapath" option are properly set for the environment. in /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php:426
Stack trace:
#0 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php(355): Laminas\Http\Client\Adapter\Socket->enableCryptoTransport('tls', Resource id #299, 'miaminationarch...')
#1 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client.php(1463): Laminas\Http\Client\Adapter\Socket->connect('miaminationarch...', 443, true)
#2 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client.php(963): Laminas\Http\Client->doRequest(Object(Laminas\Uri\Http), 'POST', true, Array, 'action=query&me...')
#3 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(1027): Laminas\Http\Client->send(Object(Laminas\Http\Request))
#4 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(894): Scripto\Mediawiki\ApiClient->request(Array)
#5 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(172): Scripto\Mediawiki\ApiClient->queryUserInfo()
#6 /home/miaminat/public_html/modules/Scripto/src/ViewHelper/Scripto.php(262): Scripto\Mediawiki\ApiClient->userIsLoggedIn()
#7 /home/miaminat/public_html/modules/Scripto/view/layout/layout-scripto-public-app.phtml(38): Scripto\ViewHelper\Scripto->loginBar()
#8 /home/miaminat/public_html/vendor/laminas/laminas-view/src/Renderer/PhpRenderer.php(585): include('/home/miaminat/...')
#9 /home/miaminat/public_html/vendor/laminas/laminas-view/src/View.php(202): Laminas\View\Renderer\PhpRenderer->render(NULL)
#10 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/View/Http/DefaultRenderingStrategy.php(92): Laminas\View\View->render(Object(Laminas\View\Model\ViewModel))
#11 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(318): Laminas\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Laminas\Mvc\MvcEvent))
#12 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(168): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent))
#13 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/View/Http/DefaultRenderingStrategy.php(110): Laminas\EventManager\EventManager->triggerEvent(Object(Laminas\Mvc\MvcEvent))
#14 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(318): Laminas\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Laminas\Mvc\MvcEvent))
#15 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(168): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent))
#16 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/Application.php(354): Laminas\EventManager\EventManager->triggerEvent(Object(Laminas\Mvc\MvcEvent))
#17 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/Application.php(335): Laminas\Mvc\Application->completeRequest(Object(Laminas\Mvc\MvcEvent))
#18 /home/miaminat/public_html/index.php(26): Laminas\Mvc\Application->run()
#19 {main}
[29-Jul-2026 19:51:50 UTC] ErrorException: stream_socket_enable_crypto(): SSL: Handshake timed out in /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php:397
Stack trace:
#0 [internal function]: Laminas\Stdlib\ErrorHandler::addError(2, 'stream_socket_e...', '/home/miaminat/...', 397)
#1 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php(397): stream_socket_enable_crypto(Resource id #960, true, 121)
#2 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php(355): Laminas\Http\Client\Adapter\Socket->enableCryptoTransport('tls', Resource id #960, 'miaminationarch...')
#3 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client.php(1463): Laminas\Http\Client\Adapter\Socket->connect('miaminationarch...', 443, true)
#4 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client.php(963): Laminas\Http\Client->doRequest(Object(Laminas\Uri\Http), 'POST', true, Array, 'action=query&me...')
#5 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(1027): Laminas\Http\Client->send(Object(Laminas\Http\Request))
#6 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(894): Scripto\Mediawiki\ApiClient->request(Array)
#7 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(172): Scripto\Mediawiki\ApiClient->queryUserInfo()
#8 /home/miaminat/public_html/modules/Scripto/src/ViewHelper/Scripto.php(262): Scripto\Mediawiki\ApiClient->userIsLoggedIn()
#9 /home/miaminat/public_html/modules/Scripto/view/layout/layout-scripto-public-app.phtml(38): Scripto\ViewHelper\Scripto->loginBar()
#10 /home/miaminat/public_html/vendor/laminas/laminas-view/src/Renderer/PhpRenderer.php(585): include('/home/miaminat/...')
#11 /home/miaminat/public_html/vendor/laminas/laminas-view/src/View.php(202): Laminas\View\Renderer\PhpRenderer->render(NULL)
#12 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/View/Http/DefaultRenderingStrategy.php(92): Laminas\View\View->render(Object(Laminas\View\Model\ViewModel))
#13 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(318): Laminas\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Laminas\Mvc\MvcEvent))
#14 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(168): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent))
#15 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/View/Http/DefaultRenderingStrategy.php(110): Laminas\EventManager\EventManager->triggerEvent(Object(Laminas\Mvc\MvcEvent))
#16 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(318): Laminas\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Laminas\Mvc\MvcEvent))
#17 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(168): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent))
#18 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/Application.php(354): Laminas\EventManager\EventManager->triggerEvent(Object(Laminas\Mvc\MvcEvent))
#19 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/Application.php(335): Laminas\Mvc\Application->completeRequest(Object(Laminas\Mvc\MvcEvent))
#20 /home/miaminat/public_html/index.php(26): Laminas\Mvc\Application->run()
#21 {main}

Next Laminas\Http\Client\Adapter\Exception\RuntimeException: Unable to enable crypto on TCP connection miaminationarchive.com: make sure the "sslcafile" or "sslcapath" option are properly set for the environment. in /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php:426
Stack trace:
#0 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client/Adapter/Socket.php(355): Laminas\Http\Client\Adapter\Socket->enableCryptoTransport('tls', Resource id #960, 'miaminationarch...')
#1 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client.php(1463): Laminas\Http\Client\Adapter\Socket->connect('miaminationarch...', 443, true)
#2 /home/miaminat/public_html/vendor/laminas/laminas-http/src/Client.php(963): Laminas\Http\Client->doRequest(Object(Laminas\Uri\Http), 'POST', true, Array, 'action=query&me...')
#3 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(1027): Laminas\Http\Client->send(Object(Laminas\Http\Request))
#4 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(894): Scripto\Mediawiki\ApiClient->request(Array)
#5 /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php(172): Scripto\Mediawiki\ApiClient->queryUserInfo()
#6 /home/miaminat/public_html/modules/Scripto/src/ViewHelper/Scripto.php(262): Scripto\Mediawiki\ApiClient->userIsLoggedIn()
#7 /home/miaminat/public_html/modules/Scripto/view/layout/layout-scripto-public-app.phtml(38): Scripto\ViewHelper\Scripto->loginBar()
#8 /home/miaminat/public_html/vendor/laminas/laminas-view/src/Renderer/PhpRenderer.php(585): include('/home/miaminat/...')
#9 /home/miaminat/public_html/vendor/laminas/laminas-view/src/View.php(202): Laminas\View\Renderer\PhpRenderer->render(NULL)
#10 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/View/Http/DefaultRenderingStrategy.php(92): Laminas\View\View->render(Object(Laminas\View\Model\ViewModel))
#11 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(318): Laminas\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Laminas\Mvc\MvcEvent))
#12 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(168): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent))
#13 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/View/Http/DefaultRenderingStrategy.php(110): Laminas\EventManager\EventManager->triggerEvent(Object(Laminas\Mvc\MvcEvent))
#14 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(318): Laminas\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Laminas\Mvc\MvcEvent))
#15 /home/miaminat/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(168): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent))
#16 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/Application.php(354): Laminas\EventManager\EventManager->triggerEvent(Object(Laminas\Mvc\MvcEvent))
#17 /home/miaminat/public_html/vendor/omeka/sanimal-mvc/src/Application.php(335): Laminas\Mvc\Application->completeRequest(Object(Laminas\Mvc\MvcEvent))
#18 /home/miaminat/public_html/index.php(26): Laminas\Mvc\Application->run()
#19 {main}
[29-Jul-2026 22:37:32 UTC] PHP Warning:  Undefined array key "lastrevid" in /home/miaminat/public_html/modules/Scripto/src/Mediawiki/ApiClient.php on line 563

That clarifies some things. My best working theory is that the server’s firewall is rate-limiting Omeka’s internal requests during group events.

When transcribers use Scripto, Omeka makes API calls back to MediaWiki on your own domain. Because it connects by domain name, those requests travel out to your site’s public address and back in through the firewall, rather than staying inside the server. With 8 people transcribing, Omeka fires dozens of these back-to-back. To the firewall, they look like a single IP spamming the site, which triggers a domino effect that results in slow load times, frozen pages, and SSL timeout errors.

Immediate Fix: Update Omeka Configuration

You can reduce how many connections Scripto opens by telling Omeka’s HTTP client to reuse a single connection rather than opening a new one for every request. Since each page makes several of these requests, that’s a meaningful reduction in what the firewall has to inspect.

Open /config/local.config.php and add (or update) the http_client block:

'http_client' => [
    'keepalive' => true,
],

Permanent Solution: Reclaim Hosting Support

While the config change above should help your transcribathons run more smoothly, you should also reach out to Reclaim Hosting support and ask them to “add a local loopback entry in /etc/hosts mapping miaminationarchive.com to 127.0.0.1.” That keeps the traffic off the external path where the firewall sees it, while leaving HTTPS and the hostname intact, so your certificate and MediaWiki’s session cookies carry on working normally.

1 Like

Thanks very much, this is very helpful.