Please list all your skills.

PHP and Ruby cannot be your only skills at this stage of your career.

The bar for US-based web developers these days is usually full-stack; lower than that and your competition are offshore developers. We're usually looking for skills in JavaScript, CSS, debugging inside the browser, NPM, SQL in a couple different flavors, basic network troubleshooting (know your way around confirming DNS is working, SSH key exchange debugging, pull and interpret the basics of a TCP dump), SSL certificate management (know how to create a CSR to installing a certificate in a trust store, manipulate a trust store, pull a cert from a server, renew a cert), working in two out of the top three cloud vendors enough to create your own free tier tiny homelab, CI/CD (Git/GitHub, Jenkins, CircleCI), Jira, and containers. This is for a Linux-oriented stack. Decide whether you want to go towards a Linux-oriented skills portfolio or Microsoft-oriented one, trying to tackle both in your situation will quickly lead to frustration, leave it for later when you're established if you really want to pick up both.

One out of many possible "self-taught" version plan of the "usual route for a CS student" for your current situation is to volunteer in your gigs going forward to help anytime there is any crisis or blocker outside your competence area, outside of billable hours. Promise you won't ask questions, only offer remedies to try if you know of any. Start by offering to take on-call duty off the clock as the go to for applications you develop for the operations team to turn to for X months, for as long as you hold a gig there. This will keenly develop your sense of where your application fits into the overall infrastructure, and how to defensively code against false positive alerts that your application "failed"/"hung"/"crashed". When you get to a point that you don't get calls for months at a time, then broaden your offer to help out issues only indirectly related to your application(s), also off the clock.

Actively listen into the conversations about the issues. At first, this means furious Googling of terms you don't understand, more furious Googling of a seemingly straight vertical wall of seemingly impenetrable technologies, and challenging yourself to understand every character of every command and operation you see spill across the screen. Every flag argument, every value of each flag argument, every command, etc. Challenge yourself to understand the interrelationships between the technologies. Offer to record the session for attaching to the issue ticket, and if transcription is available, enable it. Review the recordings over and over until you understand what you are seeing, or until the next problem comes along, whichever comes first.

Then challenge yourself to understand why someone typed a command when they did, what information they were trying to gather, who they needed help from, how they knew they needed that command at that time. Then challenge yourself to work this all out as it is all going in real time. Then challenge yourself in real incidents to pre-anticipate what the lead troubleshooting engineer is doing before they do it.

When you get to the point you're correctly anticipating >80% of the time what they're going to do before they do it, start offering your own suggestions of what to try at the rate of once per session. Feel your way towards increasing the number of suggestions of what to try before it is done. Simultaneously, broaden your understanding of the technologies by implementing them yourself on your own in your own cloud account.

When you start being consistently asked what you think during these troubleshooting sessions, start to volunteer to actually fix the problems as they come up. When you start consistently solving these problems, switch your time spent on them to billable hours if you haven't already.

Wrap all this in a can-do, pleasant, easy to work with personality no matter how much someone goads you. Focus on the mission, get it delivered, pull it across the finish line, positive persona. Be the relentlessly, persistently optimistic glue that gels together the team even under the most stressful production break fix sessions where millions of USD are being lost per unit time, and executive VP's are screaming unhinged into the conference call because the CTO, CIO and CEO are on the other line making ominous noises, because they are on their other line with the BoD making ominous noises.

By this point, you will be asked to switch contract to perm way more than you will ever get offers from blind-applications like you are submitting now. Recognized troubleshooting skills as the "go to debugger" across disparate problem and skill domains is far more rare than any kind of roadmap, self-taught or college-taught, and are highly-sought after no matter the macroeconomic climate. People who can solve problems consistently and faster than anyone else available are the ones who get return calls and high compensation.

Every single contract you've had up to now has offered you this opportunity in the guise of even the smallest problems.