Skip to main content

Posts

Showing posts with the label php

Debugging a DOS

I'm not a sysadmin, but I end up doing my best now and then when one of my sites gets into trouble. This is a sort of "after action report" of an incident that I just resolved (hopefully). I woke up and happened to check email on my phone (don't always do this, will now) and was greeted with a uptime robot email that one of my sites was down, and had been for about 4 hours. I quickly checked the site on my phone and yup, it wasn't loading. Ran to the office and hopped on my laptop. SSH to the server, and everything seems fine. Very little load on the server (AWS instance). Did a restart of apache/php/mysql and the site is still down. Weird. Running the site's index.php file on the command line works as expected and fast. Ask a few other people to check, and it's down for them. Then I logged into the AWS console and checked on status there - everything is up and running.... WTF? This is a lightsail instance, and then I noticed the outgoing network traffic h...

WSL - great tool for LAMP webdev!

 So I've been using WSL (Windows System Linux) for well over a year ago. I started with WSL 1 and then moved WSL 2 recently. All in all it's been a pretty smooth ride. I decided to ditch my mac after well over a decade of using macs and move to Windows. I wasn't happy with the price of the hardware I was getting for that price. Windows is better than it used to be... but that's not really saying much. And I've always been firmly in the Linux world when it comes to web development and hosting. So what to do? WSL fills the bill perfectly. Right now I have Ubuntu installed - all I have to do is open a Windows terminal window and type 'wsl' and I'm in a nice comfy linux world. Start up apache and MySQL, open localhost in my browser and I'm working off my local environment, almost like I was using MAMP. I did consider setting up dual-boot Windows and Linux - but my laptop just doesn't have the disk space for that. Upgrade the disk is an option, but tr...

Cleaning up a hacked wordpress site

A long-time client contacted me with a question about their SSL certificate, and said they thought the site "might be hacked." Well, boy was it hacked. Shell scripts everywhere, and core Wordpress files as well as plugins heavily modified. I think it's all cleaned up now, so I thought put up a quick post about the process while it's still fresh in my mind. How to know it's hacked? In this case, it was easy. The site looked fine in the browser, but when I logged in and looked at the files on the server there were quite a few shell scripts which are little php files (in this case) that give the attacked a 'back door' to continue to upload files/etc even if their WordPress access was closed off. Additionally, there were many core files (wp-config.php for example) that had huge chunks of encoded text inserted at the top of the file. Additionally, looking at the transfer logs revealed traffic to weird looking URLs that were definitely not legitimate pages/post...

Setting up SEO-friendly URLs in htaccess/PHP

This is something I feel like I've done dozens of times over the years, and always have to waste some time googling before I figure it out. Maybe next time I'll remember to look here? So, you're writing a custom site, and you need to be able to handle SEO-friendly URLs. You know, the kind where instead of something like "category=my_category&page=233" you the URLs to look more like "/my_category/my_page" Those are called SEO Friendly URLs and really they're also just plain friendlier for people too. They're really kind of a leftover from when a lot static HTML sites were really organized with subdirectories full of HTML files - and Apache will still work like that "out of the box" My usual approach to this has two parts. First, there's a custom .htaccess file in the main site directory, that redirects all requests (that are not for actual files/directories) to index.php Then, in the index.php there's a bit of code ...

Playing with Pico CMS

I recently started working on reanimating an ancient site I had just sitting around as a backup. It was built on a very old version of Joomla, and while some of the content is still relevant - much of it is not... So, rather than trying to figure out how to import all this content into some more modern CMS and then delete the old stuff, I decided to use this as an opportunity to play around with Pico - a PHP-based flat-file CMS. The idea is that you can easily create content by just creating markdown files in the 'content' directory, and they magically show up on the site. Organization is as simple as subdirectories inside content. Themes are just twig template files. I'm not a huge fan of twig (remember, PHP was originally a templating language... so why do we need something else for templates?) but I'll give it another try - I haven't used twig in at least six years, so maybe it's better. So far things have been going pretty smoothly - I can just copy...

Empty $_POST array in MAMP

OK, so just spent 30 minutes debugging this. I'm now using a mac as my development platform for one of the sites I support. It's worked pretty well until today when I started adding a new feature. I ran into a weird problem where POST arguments were not being made available, either in $_REQUEST or $_POST - while GET arguments were. Thanks to this page , I was pointed in a useful directions. Turns out for some reason my version of MAMP had a max_post_size of "3200M" set in its php.ini file. That was not working too well - when I changed it to 32M, everything went back to working normally. So, perhaps that will help someone else who's driving themselves crazy!

Updating on the fly

I thought this was a moderately clever solution to a problem, so I thought I'd share it here. A client wanted to add thumbnails for every entry on their huge movable-type powered blog site. They already had full-size pics for most posts, they just wanted a preview thumbnail version associated with each post for use in the xml feed, search results, etc. This is a static movable type powered site with thousands of entries. The standard solution would be to create a new field using RightFields and store the filename of an image their, and then somehow go through all those thousands of entries and create thumbnails, then save the thumb filename in the new field. And do a full rebuild of the site. This would work, but it was going to take forever ! The first thing to figure out was how to automatically create those thumbs. I knew that the first image in each post was the one to use, so it was pretty easy to set up a little php script that would find that image tag in the entry body, and...

Making live changes on large high-traffic sites

Somehow I seem to often be in the position where I need to make changes to large, complex, high-traffic sites - changes to the live site that is... Yes, they should have dev/staging servers, but they don't, and I'm not in a position to make them set it up... So changes must be made with a minimum of disruption to the site. Usually the best way to do this is to make a test copy of the page that's going to change and work with that - so that if you break something it doesn't affect the live page. But in some cases this isn't feasible - for one large site a change will involve a cascading set of php files and smarty templates - and I'd have to make copies of all of those, plus change the includes in the right place etc. to make it all work. Then undo all that to make the changes live... Not the best way to set up a system, but that's a topic for another day. So how to minimize disruption? One way I've alluded to before - take advantage of Firebug by putt...

Weird MTIfNonEmpty bug

Had a problem today with MovableType 3.2 - MTIfNonEmpty kept insisting that a field coming out of the database was empty. I sanity-checked it to death, and that damn string was not empty, but MTIfNonEmpty just wouldn't work. No idea why. So I tried a work around using another comparison tag (sorry it's late, and I don't remember what it was) - basically comparing the tag to an empty string... And this time it decided that even empty strings were not empty... WTF? I ended up fixing it by just having the MT template write out PHP to do the comparison, which of course worked fine. The only thing I could figure was that the fact that field I was doing the comparison on was an "extra field", that somehow screwed it up. Who knows?

Quick tip - imagemagick

Had to update a site today to allow its automated thumbnail creation to pad out the thumbnail with a background color, so that all the thumbs were the same size. Took a little digging to find this helpful page . The first example, using extent 100x100 worked well enough on the command line, but oddly enough wouldn't worked when called from PHP. So I used the second method that crops the image, and that worked fine. Also, I had some good feedback on the VI automation post, and actually had a pretty long post with more examples/tips - but blogger got buggered up by some of the HTML used in the example, and I abandoned the post out of annoyance. Seriously, I sort of assumed blogger stripped tags out by converting ">" to ">", etc - apparently not. Oh well, I'll do it again at some point when i get a chance.

Helpful Perl -> PHP cheat sheet

Found this helpful cheat sheet and thought it might help someone else out there. I'm in the middle of converting the first of what will be several perl-driven websites to PHP so they can be moved to a new server. This is not because of any problem with Perl (which I still prefer) but because at their new home the policy is only PHP-driven websites, for ease of maintenance, which I think is reasonable. But the conversion is kind of a hassle - I've been doing Perl for so long that I can pretty much sit down and write it without needing much reference - not so for PHP. And worse, the two are so similar that I keep thinking something will work in PHP only to run into weird (to me) syntax issues. So it goes. At least I'm paid hourly.