Apache Crashing with PHP 7 Enabled after High Sierra Upgrade

Upgrading (partially) for a System PHP 7

I finally got around to upgrading to High Sierra, which has PHP 7 as a system PHP instead of PHP 5.6. As part of that upgrade, my quick hacks of httpd-vhosts.conf for a couple of small projects had disappeared, since bringing up those virtual hosts would bring up the default site.

In the process of restoring these changes, I checked the main /private/etc/apache2/httpd.conf and noticed that
LoadModule php7_module libexec/apache2/libphp7.so
was commented out. So I uncommented it, much like I seem to recall doing for prior Apache setup.

Problems and Debugging

Strangely, after sudo /usr/sbin/apachectl restart, I was getting a connection refused. I checked for instances of httpd processes running:
ps aux | grep httpd
I found none.

Eventually, I figured out that I could do a -k option on apachectl:

sudo /usr/sbin/apachectl -k restart
httpd not running, trying to start
/usr/sbin/apachectl: line 92: 37326 Segmentation fault $HTTPD "$@"

Searching around on StackOverflow, I found that conflicting PHP versions were potentially the problem. So I commented out the php7 module again, restarted, and loaded a page with phpinfo(); on it. Sure enough, PHP 5.6 was running.


Searching in /private/etc/apache2 for other php module mentions, I found /private/etc/apache2/other/+php-osx.conf and commented out the following line:

LoadModule php5_module /usr/local/php5/libphp5.so

Restoring the php7_module in httpd.conf, I restarted Apache, and magically phpinfo(); displayed the 7.1.7 PHP version.

Mobile Billing Meter

Billing Meter bit.ly link or Billing Meter tech0x20 link.

This isn't perfect. First of all, some connections are just too slow for a constant refresh rate of less than 20-30 seconds. Secondly, I think many mobile browsers have a refresh cut-off at which point they will ask you if you really want to keep refreshing.

The first page, index.php, allows you to enter parameters:

Billing Meter

Billing Rate per Hour
Update Interval (in seconds)
Press Submit to start the counter.

The second file, meter.php, does the display, calculation and refresh:

$netseconds = time()-$_SESSION["STARTTIME"];
$cost = sprintf("%10.2lf", round($_SESSION["BILLINGRATE"]*((double)$netseconds)/3600.0,2));

Billing meter

Time spent:



Your bill:




Two page mobile magic 8-ball

Two page mobile magic 8-ball

Had to use random numbers to prevent caching of pages by mobile web browsers. It's entirely possible that I made this workaround too complicated, as I had a file version problem on my local drive (I was updating the wrong file.)

The first page uses a random number in a hidden field with the POST method:

Magic 8-ball

Ask your question, and click the button for an answer.

The second page appends a random number to the URL:

Magic 8-Ball

Magic 8-ball

The magic 8-ball says:

echo "Ask another question";


Tag Cloud for ftp blogger blogs

In the sidebar section for Blogger template, include:

The following is a modified version of tag cloud source I found.

define('PREFIX', 'labels/'); // for url
define('SEARCH_DIR', '/home/username/www/labels'); // server location of labels subdirectory

define('THIS_FILE', 'labels.php'); // name of labels file (this file)

if(file_exists(SEARCH_DIR.'_cloud_include_cache.php') &&
echo file_get_contents(SEARCH_DIR.'_cloud_include_cache.php');

* build_cloud builds a tag cloud from the labels files.
* It actually uses labels file size to determine font size... which does
* not necessarily coincide with number of posts for a given label.
* smallest file is assigned 100% font-size. largest file - 200%
* everything else is proportional in between.
function build_cloud()
$output = '';
$files = array();
$dir = opendir(SEARCH_DIR);
while($file = readdir($dir))
if($file != '.' && $file != '..' && $file != THIS_FILE && $file != CACHE_FILE)
$files[$file] = filesize(SEARCH_DIR."/".$file);
$low_end = min($low_end, $files[$file]);
$high_end = max($high_end, $files[$file]);
foreach($files as $name=>$size)
$output .= "
htmlentities(str_replace('.php','',$name))." ";
echo $output;

$fp = fopen(SEARCH_DIR.'_cloud_include_cache.html','w');
fwrite($fp, $output);
function get_style($low_end, $high_end, $size)
$net = $high_end - $low_end;
$font_size = (($size - $low_end) * 100) / $net + 100;

if(!$interval) $interval++;

return "font-size: ".$font_size."%;";