Most write-ups of a host like this are a paraphrase of its own features page. We put a working application on it instead — a book catalogue reading 1,500 rows out of MySQL with a cover image on every card — and recorded what the account could actually do. It is still running, alongside three other free hosts with the same code on them.
It Looks Like InfinityFree Underneath
Worth saying early, because people ask: everything we measured suggests ProFreeHost is a reseller of the same iFastNet platform that runs InfinityFree. Same FTP host, neighbouring IPs, identical PHP and database builds, identical quotas. Neither company states it, so treat it as a strong inference rather than a fact — we set out the full evidence in our side-by-side comparison of four free PHP hosts, and there is a write-up of InfinityFree itself if that is the one you were weighing.
One consequence is practical enough to matter here. InfinityFree's terms allow three free accounts per person and terminate all of them if you register a fourth. So when you need one more site, a second email address on the same brand is the move that loses you everything, and a different brand is the one that does not. That, rather than any difference in the hardware, is the case for registering ProFreeHost.
The rest of this is about ProFreeHost specifically: what the account gives you, and what fought us on the way to a working site.
What the Free Plan Gives
| Free plan | |
|---|---|
| PHP | 8.3.19, apache2handler, memory_limit 512M, max_execution_time 60s |
| Database | MariaDB 11.4.13, unlimited databases, wait_timeout 20s |
| Disk | 5 GB, 80,000 inodes |
| Bandwidth | Unlimited — the real cap is 50,000 hits a day |
| HTTPS | Valid, on the free subdomain, out of the box |
| Outbound from PHP | Works — cURL, allow_url_fopen and fsockopen all succeed |
| Shell access | None. exec, shell_exec, proc_open, popen all disabled |
| Extensions | curl, gd, imagick, mbstring, zip, intl, openssl, sqlite3 — no pdo_pgsql, no OPcache |
| Upload limit | upload_max_filesize 20M |
Two of those deserve attention. Outbound network access works, which is rarer on free PHP hosting than it should be and is what lets WordPress update itself, OAuth complete, and any third-party API be called at all. And OPcache is off, so every request recompiles your PHP — on a framework with hundreds of files that is a real cost, and it is not something a benchmark of one small page will show you.
Once it was serving, the application reported 4 ms of server-side render, 1.2 ms to connect to MySQL and 2.3 ms for the query. Importing 1,500 rows took 152 ms. The machine is not slow.
Getting Your Files On It Is the Hard Part
Everything above assumes the files are up there. That was the part that took an evening.
The file manager did not work
Uploads through the web file manager reported success and then listed zero items; the file it claimed to have accepted returned 404. It also refuses to open at all while an ad blocker is running. If you are a beginner and the file manager is the only tool you know, this is where you stop.
FTP refuses plaintext, and lies about why
ProFreeHost's FTP requires explicit TLS. Connect without it and the server answers:
530 Login authentication failed
That is the same response as a wrong password. Nothing distinguishes them. With correct credentials copied straight from the panel, the natural conclusion is that you mistyped something — so you retry, and retry, and eventually get your IP rate-limited for repeated failed logins. Turn on FTPS and the same credentials work first time.
This is the single most useful thing in this article. If your ProFreeHost FTP login "fails", check encryption before you touch the password.
There is no SSH, and nothing else either
No shell, no cron, no Git deploy, no rsync. FTP is the whole story, and at roughly 5 KB/s per file on our connection, pushing 1,500 small images took just over an hour. Plan deployments accordingly: this is not a host you iterate on.
It Rewrites Every Image You Upload
This is the finding we have seen nowhere else, and it is worth understanding before you put a photo gallery on it.
Upload a JPEG over FTP and read it back, and you do not get your file. You get a re-encoded one, carrying a comment the original never had:
CREATOR: gd-jpeg v1.0 (using IJG JPEG v80)
The platform decodes and re-encodes uploaded images through PHP's GD library. Measured on our own files:
| Format | Sent | Stored | Change |
|---|---|---|---|
| JPEG | 12,902 B | 15,982 B | +24% |
| PNG | 36,932 B | 40,293 B | +9% |
| GIF | 14,591 B | 13,721 B | -6% |
| 1,500 real book covers | 25 MB | ~30 MB | +21% |
Pixel dimensions are preserved, so nothing looks wrong. Three things follow anyway:
- You cannot serve byte-exact images. Checksums, signatures and content-addressed filenames all stop matching.
- Your images get bigger. The 21% comes out of your disk quota and your visitors' download, not the host's.
- Anything appended after the JPEG end marker is deleted. We padded a file with 16 random bytes; the stored copy came back byte-identical to the unpadded version.
That last point is almost certainly the reason for all of it. Re-encoding an image destroys anything hidden inside it, which is the standard defence against polyglot files — a JPEG with PHP stapled to the end. As a security measure it is sound. As an undocumented one, it means a deploy that verifies its own uploads will disagree with the server for reasons nobody can explain.
And it happens after you have stopped looking
The rewrite is asynchronous. We uploaded a file and polled its size:
t+0s 12,918 bytes
t+2s 12,918 bytes
t+5s 15,982 bytes
t+60s 15,982 bytes
For the first two seconds the file is exactly what you sent. A deploy script that uploads and immediately verifies — the obvious way to write one — passes, and is wrong a few seconds later. Ours did exactly that before we went looking.
The Database Exists Only Inside the Server
The panel gives you a MySQL hostname that looks routable, sql301.ezyro.com. It resolves, publicly, to 192.168.0.191 — a private address. There is no remote MySQL: not firewalled, not permitted-with-configuration, simply unreachable by construction.
The practical consequences: no MySQL Workbench, no HeidiSQL, no local Adminer, no backup script that connects from your machine. phpMyAdmin in the panel, or SQL run by your own PHP, and that is the list. And because the failure presents as a connection timeout rather than a refusal, the first thing it looks like is your own network.
Nothing Can Watch It
Every scripted HTTP request to a ProFreeHost site is answered with a JavaScript challenge page instead of the site — served with HTTP 200. A naive check reports success while receiving nothing.
So: no uptime monitor, no API, no health check in a deploy pipeline, no PageSpeed run, no scripted anything. A script cannot even determine whether a file exists, because a request for a filename we had never created also returned 200. Only a real browser gets through.
Worth weighing honestly: for a coursework site or a demo, none of that matters. If you were planning to point UptimeRobot at it, or serve JSON to an app, stop here.
50,000 Hits, and What Happens When You Reach It
ProFreeHost documents this clearly, which is more than most:
A hit is a request to a file on your website, which could be an HTML or PHP page, an image, a CSS file, or something else entirely. […] Your account will be taken offline for 24 hours if you receive 50,000 hits in a single day.
Their own worked example: two CSS files, three scripts and five images make eleven hits for one page view. The arithmetic is documented; what nobody does is apply it to a real page. Ours costs thirteen requests, so the allowance buys roughly 3,800 views a day. A page with sixty distinct images would buy 819.
Count distinct URLs, not visible elements — an earlier version of our test page showed sixty cards drawn from eight image files, and cost nine requests rather than the sixty-one we assumed. Open your own site, press F12, and read performance.getEntriesByType('resource').length + 1. That is your divisor.
And note the penalty is the whole site going dark for a day, not throttling.
One More Thing the Panel Gets Wrong
After we had uploaded 1,500 files and 25 MB, the control panel still reported 19 MB used, 832 inodes, and a hit counter far below what had actually happened. On the InfinityFree side it was worse: 2 MB and 19 inodes, with the files verifiably on disk.
The statistics lag, badly. Do not use them to judge how close you are to a limit — by the time the panel says you are near one, you may be past it.
Should You Register It
- Yes, if you have hit InfinityFree's three-account ceiling and need another site. That is the honest case, and it is a good one.
- Yes, for coursework, a WordPress or Laravel practice site, or a demo you want on a real domain with working HTTPS. It does that competently.
- No, if you upload photographs and expect to get them back. They will be re-encoded and larger.
- No, if anything needs to monitor, call, or deploy to it automatically. Nothing can.
- No, if you have an InfinityFree account and expect a second opinion. Every figure we measured matched, so there is nothing to compare.
If the limits above are the problem rather than the price, the next step is not another free shared host — it is a free VPS you administer yourself, where the shell, the database port and your own image files are all yours.
FAQ
Is ProFreeHost safe to use?
It is a long-running iFastNet reseller, and HTTPS on the free subdomain is a real certificate rather than a warning page. It also comes with no SLA, no support beyond a forum, and an account that can be closed without recourse. Treat it as what it is: free hosting worth using, never the only copy of anything.
Why does my ProFreeHost FTP login keep failing?
Check encryption before you check the password. The server rejects plaintext FTP with 530 Login authentication failed, which is identical to the wrong-password response. Set your client to explicit FTPS (FTP over TLS) and try the same credentials again.
Can I connect to the database from my computer?
No. The MySQL hostname resolves to a private address, so remote clients cannot reach it at all. Use phpMyAdmin in the panel.
Is ProFreeHost better than InfinityFree?
Everything we could measure came out the same — PHP build, database build, quotas, limits — so we would not expect a performance difference. Choose on account availability rather than specs.
Does it delete inactive accounts?
We have not had an account long enough to observe it here, so we will not guess. Its sister platform's dashboard has told us in writing that an account was disabled after a year without a login, so treat a forgotten free account as a lost one.
Check It Yourself
The deployment is live at toolfreebie.liveblog365.com, with the capability probe beside it, and the same application is running on three other free PHP hosts for comparison. The code is at github.com/build996/free-tier-bench — deploy it to a host we did not cover and you get a comparable set of numbers.
These figures are one deployment, on one day, from one location. That is enough to establish a refused protocol, a private IP behind a public hostname, or an image that comes back different from the one you sent — facts that do not vary with the weather. It is not enough to rank hosts by speed, and we do not.