php 7.1 and nginx not storing sessions

Posted on

Depending on your server settings, you may find every now and then and installing new modules, or program updates through yum, can break things.

Well, this happened to me.

I can’t explain what went wrong exactly, but after attempting to install the php mbstring extension, I had the whole thing go belly up.

After some frantic searching, I was able to solve the problem (eventually) by giving access once again to the nginx server, so it could store sessions.

Strangely enough, it was a permission error, where the location where php7.1 wanted to store it’s files had mysterious changed, or, the permission for that path had changed.

The solution was found in /var/opt/remi/php7X of all places.

Also, to help you find the problems, just look in your log files. It will often tell you what is wrong, or as to why it can’t do a certain task.

I thought I’d just let everyone know my quick thoughts.


Drive, Folder, Files Browsing 2107

Posted on Updated on

Finally, after searching the internet and finding nothing without modification I want to release some code, as it used be in the old VB5 and VB6 days.

I modified the code I’d found originally, and can’t remember which site did it, because most didn’t work at all. This however will get you the basics back using VB.NET.

(EDIT) Actually, this is the original code.  A HUGE THANKS!!!



Imports Microsoft.VisualBasic
Imports System.IO 'File Operations 

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub

Private Sub TV_Explorer_BeforeExpand(sender As Object, e As TreeViewCancelEventArgs) Handles Tv_Explorer.BeforeExpand
 Dim DrvIsReady As Boolean = (From d As DriveInfo In DriveInfo.GetDrives Where d.Name = e.Node.ImageKey Select d.IsReady).FirstOrDefault

If (e.Node.ImageKey <> "Desktop" AndAlso Not e.Node.ImageKey.Contains(":\")) OrElse DrvIsReady OrElse Directory.Exists(e.Node.ImageKey) Then
 AddChildNodes(e.Node, e.Node.Tag.ToString)

ElseIf e.Node.ImageKey = "Desktop" Then
 Dim PublicDesktopFolder As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory)
 Dim CurrentUserDesktopFolder As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
 AddChildNodes(e.Node, CurrentUserDesktopFolder)
 AddChildNodes(e.Node, PublicDesktopFolder)

 e.Cancel = True
 MessageBox.Show("The CD or DVD drive is empty.", "Drive Info...", MessageBoxButtons.OK, MessageBoxIcon.Information)
 End If
 End Sub

Private Sub TV_Explorer_AfterCollapse(sender As Object, e As TreeViewEventArgs) Handles Tv_Explorer.AfterCollapse
 End Sub

Private Sub TV_Explorer_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles Tv_Explorer.AfterSelect
 TxtBx_Path.Text = e.Node.Tag.ToString
 End Sub

Private Sub TV_Explorer_NodeMouseDoubleClick(sender As Object, e As TreeNodeMouseClickEventArgs) Handles Tv_Explorer.NodeMouseDoubleClick
 If e.Button = MouseButtons.Left AndAlso File.Exists(e.Node.Tag.ToString) Then
 Catch ex As Exception
 MessageBox.Show(ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Error)
 End Try
 End If
 End Sub

Private Sub AddSpecialFolderRootNode(SpecialFolder As SpecialNodeFolders)
 Dim SpecialFolderPath As String = Environment.GetFolderPath(CType(SpecialFolder, Environment.SpecialFolder))
 Dim SpecialFolderName As String = Path.GetFileName(SpecialFolderPath)

AddImageToImgList(SpecialFolderPath, SpecialFolderName)

Dim DesktopNode As New TreeNode(SpecialFolderName)
 With DesktopNode
 .Tag = SpecialFolderPath
 .ImageKey = SpecialFolderName
 .SelectedImageKey = SpecialFolderName
 End With

 End Sub

Private Sub AddDriveRootNodes()
 For Each drv As DriveInfo In DriveInfo.GetDrives
 Dim DriveNode As New TreeNode(drv.Name)
 With DriveNode
 .Tag = drv.Name
 .ImageKey = drv.Name
 .SelectedImageKey = drv.Name
 End With
 End Sub

Private Sub AddChildNodes(tn As TreeNode, DirPath As String)
 Dim DirInfo As New DirectoryInfo(DirPath)
 For Each di As DirectoryInfo In DirInfo.GetDirectories
 If Not (di.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
 Dim FolderNode As New TreeNode(di.Name)
 With FolderNode
 .Tag = di.FullName
 If Tv_ImgList.Images.Keys.Contains(di.FullName) Then
 .ImageKey = di.FullName
 .SelectedImageKey = di.FullName
 .ImageKey = "Folder"
 .SelectedImageKey = "Folder"
 End If
 End With
 End If

Dim files As String()
 Dim file As String
 files = IO.Directory.GetFiles(DirPath) 'Your directory
 For Each file In files
 Dim FileInfo As New FileInfo(file)
 File_ListView.Items.Add(FileInfo.Name) 'adds all files in directory to listbox
 Catch ex As Exception
 MsgBox("You Can't Enter The Folder", MsgBoxStyle.Critical)
 End Try

Catch ex As Exception
 MessageBox.Show(ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Error)
 End Try
 End Sub

Private Sub AddSpecialAndStandardFolderImages()
 AddImageToImgList(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Folder")

Dim SpecialFolders As New List(Of Environment.SpecialFolder)
 With SpecialFolders
 End With

For Each sf As Environment.SpecialFolder In SpecialFolders
 End Sub

Private Function AddImageToImgList(FullPath As String, Optional SpecialImageKeyName As String = "") As String
 Dim ImgKey As String = If(SpecialImageKeyName = "", FullPath, SpecialImageKeyName)
 Dim LoadFromExt As Boolean = False

If ImgKey = FullPath AndAlso File.Exists(FullPath) Then
 Dim ext As String = Path.GetExtension(FullPath).ToLower
 If ext <> "" AndAlso ext <> ".exe" AndAlso ext <> ".lnk" AndAlso ext <> ".url" Then
 ImgKey = Path.GetExtension(FullPath).ToLower
 LoadFromExt = True
 End If
 End If

If Not Tv_ImgList.Images.Keys.Contains(ImgKey) Then
 'Tv_ImgList.Images.Add(ImgKey, Iconhelper.GetIconImage(If(LoadFromExt, ImgKey, FullPath), IconSizes.Large32x32))
 End If

Return ImgKey
 End Function

Private Enum SpecialNodeFolders As Integer
 Desktop = Environment.SpecialFolder.Desktop
 Favorites = Environment.SpecialFolder.Favorites
 History = Environment.SpecialFolder.History
 MyDocuments = Environment.SpecialFolder.MyDocuments
 MyMusic = Environment.SpecialFolder.MyMusic
 MyPictures = Environment.SpecialFolder.MyPictures
 MyVideos = Environment.SpecialFolder.MyVideos
 Recent = Environment.SpecialFolder.Recent
 UserProfile = Environment.SpecialFolder.UserProfile
 End Enum

End Class

eBay Parcel Tracking!!!??

Posted on

So maybe you are like me and you collect the odd parcel from eBay every now and then, but they give you a crazy tracking number that doesn’t work?

Well, you need to check out this site, which will tell you where your package is and where it’s going.

This is especially helpful when Australia Post doesn’t specially know either.

Enter this example number, and you’ll see what I’m talking about: UPAAB000000234365152
(It’s not my order)


This isn’t UPS, USPS or HDL. It’s for eBay postage.

Raid6 Recovery on a ReadyNAS Ultra 6

Posted on Updated on

Ok, well this was the update I didn’t want to ever need to do. But, I’ve done it and so far it’s been sucessful.

About a month ago, I was sitting using my computer, and for no “apparent” reason, I got a message saying “Server is shutting down”. I thought that was weird, but it did as it said. My NetGear ReadyNAS Ultra 6 shut itself down, and didn’t want to come back up – at all.

I didn’t know what to do, so I let it sit for a while.

I’ve always kept the NAS up to date with the official stock OS of RAIDiator 4.X, so I knew it probably wasn’t going to be something weird of a customisation I’d done.

A long time ago, I’d read that this NAS had a VGA out port on the motherboard. I’d never looked at this before, but I thought that may be my go-to. So I pulled the guts out of the board to see what the problem was.


I figured a drive may have died, but I didn’t know which one, or how to diagnose the issue, because the NAS just wouldn’t boot. In the past I’d received emails telling me that drives were failing and that it was going to shut down, but this time… I didn’t get those messages.

So, I travelled to my local computer shop and bought a new 3TB WD Red drive, and a VGA breakout port… turns out while the computer geek who served me, didn’t notice (nor myself) that the pins on the AUS GEFORCE GT 710 card was actually 8 pins and not the required 15 pins. So… that was a waste of $40.

Instead I went to JayCar and collected all the bits I needed to make sure I could do this thing and potentially read any output of the VGA port on the board. At this stage I didn’t even know if I could do it…


So, I built all the bits and then when I booted the device… It showed up on the screen… BINGO! 🙂


I had a dead drive.

This NAS is just your standard computer with bit of custom work for the NAS stuff. The BIOS told me it was all normal and that the drive was dead. So… I took out my Seagate 3TB drive – yeah, you know the type… What ever you do in the future – stay clear of these drives ST3000DM001. Trust me. Just look them up in Google, and you’ll see what I’m getting at.

I replaced it with the WD Red drive and boom, it started up and started a resync.


I had to move the NAS to a different location and was a bit hesitant to switch it off during a resync, but, if a controlled shutdown is performed, a resync will continue safely.

Everything was going great.

I fixed up the notifications so I’d get alerted via email and also push alerts (via Pushover) and it was all good. Actually, while I’m on that, you should look in to for real-time alerts on your phone or device. It’s brilliant.

So, the big scary problem happened next.

I was tidying up around the place and a small power plug knocked the top of the NAS. The NAS beeped (which is weird, ’cause it beeps when the front door opens too) and I received a series of messages on my phone too…

Those messages were the very big concern.

***** File system check performed at Sun Oct  8 13:22:00 EST 2017 *****
fsck 1.42.12 (29-Aug-2014)
fsck.ext4: No such file or directory while trying to open /dev/c/c
Possibly non-existent device?


The paths for the shares listed below could not be found.  Typically, this occurs when the ReadyNAS is unable to access the data volume.
[Sun Oct  8 13:22:17 EST 2017]


Oh dear… This meant bad news. really bad news.

So, I did some digging.

My Admin panel said “No Volumes”. I nearly freaked. My computer couldn’t located the shared drive paths either.

After doing some searching, I found a few answers I wasn’t sure about, but it couldn’t hurt.

I logged in via FTP. As suggested, there was nothing in the “/c/” path, or in the “/mount/c” path. So… this was troubling.

What I discovered which was worse is that RAID6 array had failed to mount, or load, or something. This was bad. 9TB of data missing…

This was as bad as it gets.

Or was it?

Below is a list of the commands I typed via SSH, and you can clearly see the results.

In case you don’t know how to SSH to your box, you should have already installed the Enable Root SSH Access” Addon. If you haven’t, then you’ll need to find a way in before you run these commands.

ReadyNas:~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] 
md1 : active raid1 sda2[0] sdf2[8] sde2[7] sdd2[6] sdc2[9] sdb2[1]
 524276 blocks super 1.2 [6/6] [UUUUUU]
md0 : active raid1 sda1[0] sdf1[6] sde1[8] sdd1[7] sdc1[9] sdb1[2]
 4193268 blocks super 1.2 [6/6] [UUUUUU]
unused devices: <none>

ReadyNas:~# mdadm --examine
mdadm: No devices to examine

ReadyNas:~# cat /proc/mdstat 
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] 
md1 : active raid1 sda2[0] sdf2[8] sde2[7] sdd2[6] sdc2[9] sdb2[1]
 524276 blocks super 1.2 [6/6] [UUUUUU]
md0 : active raid1 sda1[0] sdf1[6] sde1[8] sdd1[7] sdc1[9] sdb1[2]
 4193268 blocks super 1.2 [6/6] [UUUUUU]
unused devices: <none>

ReadyNas:~# mdadm --examine 
mdadm: No devices to examine

ReadyNas:~# mdadm --assemble --scan --assume-clean
mdadm:option --assume-clean not valid in assemble mode

ReadyNas:~# mdadm --assemble --scan 
mdadm: /dev/md/001AD40EDDAC:2 assembled from 5 drives and 1 rebuilding - not enough to start the array while not clean - consider --force.
mdadm: No arrays found in config file or automatically

ReadyNas:~# mdadm --scan 
mdadm: --scan does not set the mode, and so cannot be the first option.

ReadyNas:~# mdadm --assemble --scan
mdadm: /dev/md/001AD40EDDAC:2 assembled from 5 drives and 1 rebuilding - not enough to start the array while not clean - consider --force.
mdadm: No arrays found in config file or automatically

ReadyNas:~# mdadm --assemble --scan --force
mdadm: Marking array /dev/md/001AD40EDDAC:2 as 'clean'
mdadm: /dev/md/001AD40EDDAC:2 has been started with 5 drives (out of 6) and 1 rebuilding.

ReadyNas:~# cat /proc/mdstat 
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] 
md127 : active raid6 sda3[0] sdf3[6] sde3[8] sdd3[7] sdc3[9] sdb3[2]
 11702178816 blocks super 1.2 level 6, 64k chunk, algorithm 2 [6/5] [UU_UUU]
 [>....................] recovery = 2.4% (71975936/2925544704) finish=1255.9min speed=37866K/sec
md1 : active raid1 sda2[0] sdf2[8] sde2[7] sdd2[6] sdc2[9] sdb2[1]
 524276 blocks super 1.2 [6/6] [UUUUUU]
md0 : active raid1 sda1[0] sdf1[6] sde1[8] sdd1[7] sdc1[9] sdb1[2]
 4193268 blocks super 1.2 [6/6] [UUUUUU]
unused devices: <none>


As you can see, the md127 listing, this meant that the RAID6 was back! And… It was ready to resync!!

So, I cleanly restarted the box, and it’s now resyncing the data and all the shares are  working again. All shares are back. And I’m super happy I still have my data! 😀


I hope this helps someone. ‘Cause it was difficult to know what to do, but it was fairly simple in the end.

Getting the IPs from AWS on a load balancer using Piwik Stats

Posted on Updated on

I’ll keep this short and give the general gist of this.

Basically I had a problem, whereby Piwik was not getting the correct IP of the visitor, as the AWS setup was not passing the correct IP through on the expected value.

Try this code out as a test and see what you get.

Getting server/client IP:<br>


echo "1: " . $_SERVER['SERVER_ADDR'] . "<br>";
echo "2: " . $_SERVER['SERVER'] . "<br>";
echo "3: " . $_SERVER['HTTP_X_FORWARDED_PORT'] . "<br>";
echo "4: " . $_SERVER['HTTP_X_FORWARDED_PROTO'] . "<br>";
echo "5: " . $_SERVER['HTTP_X_FORWARDED_FOR'] . "<br>";
echo "6: " . $_SERVER['SERVER_ADDR'] . "<br>";
echo "7: " . $_SERVER['SERVER_PORT'] . "<br>";
echo "8: " . $_SERVER['REMOTE_ADDR'] . "<br>";

echo phpinfo();

As an intro, to help you figure out the correct value, use the above code as a test.

The problem with the suggestions on the Piwik site saying to make changes to these files, is that is didn’t work for me.

; Uncomment line below if you use a standard proxy
;proxy_client_headers[] = HTTP_X_FORWARDED_FOR
;proxy_host_headers[] = HTTP_X_FORWARDED_HOST

; Uncomment line below if you use CloudFlare
;proxy_client_headers[] = HTTP_CF_CONNECTING_IP

; Uncomment line below if you use another proxy (that sets Client-IP header)
;proxy_client_headers[] = HTTP_CLIENT_IP

You have more luck, but it’s for viewing here:

So, while there are many values in Piwik to have various settings, it’s worth filling in as many as possible…

The key value for this IP issue is this:


Here’s an example that will probably work for you. It’s pulled from a live site, but modified for anonymous use).


global $IDSITE;
$IDSITE = 2;  
// This is so we can get the correct IP of the visitor from behind the AWS load balancer.    
    { $IP_Tracker = $_SERVER['HTTP_X_FORWARDED_FOR'];} else
    { $IP_Tracker = $_SERVER['REMOTE_ADDR']; }
$pagetitle = "Home"; // The name of the tab for the stats.
// Tracking Code
// -- Piwik Tracking API init -- 
require_once "PiwikTracker.php";
PiwikTracker::$URL = '';

$t = new PiwikTracker( $IDSITE, '');

// End of configuration settings.  

// Optional function calls
$vid = '';

// Allow the follow-through tracking from page to page. - Visitor ID
if( isset($_POST['vid']) ) { $vid = addslashes($_POST['vid']); } else { if( isset($_GET['vid']) ) { $vid = addslashes($_GET['vid']); } }; // get vid
if(strlen($vid) > 10 && strlen($vid)< 30) { $t->setVisitorId($vid); }; // double check it
// If you want to force the visitor IP, or force the server date time to a date in the past,
// it is required to authenticate the Tracking request by calling setTokenAuth
// You can pass the Super User token_auth or any user with 'admin' privilege on the website $idSite

$token_auth = "YOURTOKEN";
$t->setTokenAuth( $token_auth );
$t->setIp( $IP_Tracker );
// If you wanted to force to record the page view or conversion to a specific visitorId
$t->setUrl($url = '');

// Finally, track the page view with a Custom Page Title
// In the standard JS API, the content of the <title> tag would be set as the page title

<a href="http://app.yoursitecom/page2.php?vid=<?php echo $t->getVisitorId(); ?>">Page 2</a>






Artist and Song search of Spotify and iTunes via web URL

Posted on Updated on

This took me a while to find out how to do, so I thought I’d share my research to you.

I had a problem where I wanted users to be able to click on a link and it would open up the Spotify, or iTunes program to the search results of the values I passed it.

As mentioned, this took a long while to get. The Spotify one was easy as, and they should be commended for their simplicity. The iTunes one was not as easy to find.

So, this is my resulting code example, which I hope will help you in the future.

See this example work in JSFiddle


&lt;a href=";media=music&amp;restrict=true&amp;submit=seeAllLockups&amp;entity=songs&amp;allArtistNames=tobyMac&amp;allTitle=Love+Broke+Thru"&gt;&lt;i class="fa fa-apple"&gt;&lt;/i&gt;Apple iTunes&lt;/a&gt;
&lt;a href="spotify:search:tobyMac+Love+Broke+Thru"&gt;&lt;i class="fa fa-spotify"&gt;&lt;/i&gt;Spotify&lt;/a&gt;

PHP Source Code

$artist = "TobyMac";
$title = "Love Broke Through";
echo '&lt;a href="spotify:search:' . str_replace(" ","+",$artist) . "+" . str_replace(" ","+",$title) . '"&gt;&lt;i class="fa fa-spotify"&gt;&lt;/i&gt; Spotify&lt;/a&gt;';
echo '&lt;a href=";media=music&amp;restrict=true&amp;submit=seeAllLockups&amp;entity=songs&amp;allArtistNames=' . str_replace(" ","+",$artist) . "&amp;allTitle=" . str_replace(" ","+",$title) . '"&gt;&lt;i class="fa fa-apple"&gt;&lt;/i&gt; iTunes&lt;/a&gt;';

// Or so the browser opens a window and then closes it.
$iTunes_link = ";media=music&amp;restrict=true&amp;submit=seeAllLockups&amp;entity=songs&amp;allArtistNames=". str_replace(" ","+",$artist) . "&amp;allTitle=" . str_replace(" ","+",$title);
echo '&lt;a href="javascript:closeOnLoad(\'' . $iTunes_link. '\');"&gt;&lt;i class="fa fa-apple"&gt;&lt;/i&gt;&lt;/a&gt;';


&lt;script type="text/Javascript"&gt;
function closeOnLoad(myLink)
    var newWindow =;

Both of these examples do 2 different things.
The Full iTunes example opens up a new window by JS and then closes it a second later. This is to allow the page to load, and then have the Apple page call the iTunes program. It then opens it to an advanced search page (which until I started playing with this stuff didn’t even know existed).

The Spotify example just opens the app directly if you have it installed – if you don’t use WordPress of course. They’ve wrecked the link in the example by removing the “spotify:search:” at the front of the link.

If this has helped you, please let me know, I’d love to hear, even send me a donation through PayPal.

Cloudflare is great – most of the time.

Posted on Updated on

So for the last month or so, I’ve given a few sites the Cloudflare boost. The DNS has come up faster, pages and the sites work much better.

However, I’ve discovered something it doesn’t work so well for…

I run GLPI and it’s great for computer digital asset management.

However today I discovered how frustrating it can be as well for certain applications. On my CMS and other static sites I have no problems with it, as it compresses the JS, CSS and HTML for speed – which is good.

But. As it turns out, GLPI doesn’t play nicely with a feature that CloudFlare offer. Granted, they call it BETA technology so I will give them that, but, after having upgraded my version to the latest and still have it breaking and breaking other parts that were not broken originally, I managed to finally figure out the problem.

The JS that Cloudflare inserts breaks pretty much every “html::” POST class in GLPI.

So, the solution is to disable what they call “Rocketscript”, and your site will work fine.

These pages will explain it a little better: