Setting up remote step debugging with Zend Studio

Recently I was helping someone set up step debugging of PHP in Zend Studio to debug a remote site, and had some difficulties. So I decided to create this post to remind me later, and perhaps help others get it set up.

I was doing this on an Ubuntu laptop, so while menus may vary slightly the process should be very similar regardless of OS. Also, I did this using a local VirtualBox virtual machine, using Bridged networking mode to simulate a remote server. In Zend Studio I had a project created with the Zend Framework Skeleton Application, and created a virtualhost in the virtual environment that mirrored that.

NOTE: If the desire is to use a local server the setup is much simpler.

Server setup

While this post doesn’t cover how to install Zend Debugger or Xdebug, ensure one of these are set up correctly. Also, ensure the debugger of choice “knows” where to find the IDE to be debugging from. Zend Debugger can try to do this automatically, or an IP can be manually specified within Zend Debugger or Xdebug. Also, if using Zend Debugger ensure the IP of the client is added to the whitelist. More on how to verify this IP from the client later.

Aiming at the server

The first step, assuming you already have a project created in Zend Studio, is to add a server to the project configuration. Do this in the preferences. (Windows|Preferences)  With the preferences open, expand the PHP node to get to Servers.

Screenshot from 2016-04-03 15:17:07

From there click “New”, and follow the wizard for setup. The first step is to specify the type of server. In my case I was using an install of Zend Debugger that comes with Zend Server, so selected Remote Zend Server. Alternatively I could have easily selected Generic PHP Server to arrive at the same endpoint later.

Screenshot from 2016-04-03 15:17:47

Next, after giving this server a name and URL (ensure the URL actually hits the server), I am prompted for the Zend Server login credentials to gain access to the Zend Server Web API.

Screenshot from 2016-04-03 15:19:09

Entering the user and password authorizes Zend Studio to pull down an API key for interacting directly with Zend Server if I desired to later. (This creates a new Zend Server Web API Key on the server specifically for this client.) Alternatively it is possible to click Cancel and enter the credentials manually.

Again, this is not really required for simply debugging, but I’m including it for completeness sake.

Screenshot from 2016-04-08 09:25:43

At this point a test can be run to ensure we are hitting the server as expected by clicking the Test button.

NOTE: If this doesn’t end in a success you may have some network issues to overcome. See my post on using an SSH Tunnel if you need to.

Screenshot from 2016-04-03 15:20:12

After a success, click OK and then Finish the wizard. If you had troubles, please see my post for using an SSH tunnel.

Enable debugging for the project

With the server set up it is now possible to set up debugging for the Zend Studio project.

In the Preferences (Windows|Preferences) click on the Debug within the PHP node.

Screenshot from 2016-04-03 15:21:16

Though it is possible to specify the PHP Server globally from the resulting option screen I prefer to set up preferences for each project, since most of my projects may be different in any way. So I click Configure Project Specific Settings… link at the top of the dialog and am prompted to specify which project I desire to configure.

Screenshot from 2016-04-03 15:21:57

After selecting the appropriate project I can then appoint the server I just added above, and then specify the Base Path and ensure the Auto-generated Base URL is correct in the lower section.

Screenshot from 2016-04-03 15:22:26

After approving and closing the Preferences, we are ready to debug!!!

Test: If the following step doesn’t work it may be because the debugger on the server cannot find the IDE. In a browser check what ports the IDE is listening on by entering the following URL to hit Zend Studio’s built in web server.

Screenshot from 2016-04-08 09:48:52

If the debug_host doesn’t show an IP address reachable by the server then it may be necessary to manually specify the IP in Zend Studio by altering the server configuration we created previously.

If the IP address should be reachable by the server the issue may be in the configuration on the servers end, or perhaps a firewall or load balancer in between is limiting. Please see my post on how to get around this with an SSH tunnel.

Since I was using Zend Server in this example I have Z-Ray available, and while on a page I wished to debug I could simply click on the debug icon and select any of the debugging options.

Screenshot from 2016-04-03 15:24:13

This will cause Zend Debugger to contact Zend Studio for debugging, which in turn will ask the user if they wish to open the debugging perspective.

Screenshot from 2016-04-03 15:24:44

If Yes is selected the IDE is now ready to perform any debugging the user desires.

Screenshot from 2016-04-03 15:27:24

I hope this helps others. Happy debugging!!!

This post is one in a series on debugging. For others click below:

PhpStorm and debugging issue
Using an SSH tunnel to step debug through a firewall
Setting up local step debugging with PhpStorm

PHPStorm and debugging IP issue

Recently I was helping someone troubleshoot an issue using PhpStorm and Zend Debugger. In this case Zend Studio was able to debug an application using Zend Debugger while PhpStorm was failing unless an SSH tunnel was used. The error received was:

Host ‘’ is not allowed to open debug sessions – please configure zend_debugger.allow_hosts in the ini file.Failed to connect to host ‘’, reason: ‘Connection refused’.

The person experiencing this issue was attempting to debug a site in a VirtualBox virtual machine from the host machine. Both the host machine and the virtual machine were running Ubuntu 14.04. At first glance I thought adding to the allowed hosts would do it. But turns out it was more than that.

In this case we knew there was not a firewall blocking access, so it had to be networking.

To start things off I wanted to take a look at what PhpStorm was listening to, so I used the broadcast port 20080 to see this in a browser:

Screenshot from 2016-04-04 16:13:09

So it appears PhpStorm was attempting to use the IP addresses linked to the host systems ‘localhost’ and ‘hostname’, but not an IP address accessible via the network. This meant the server would never be able to send information back to the IDE without the use of an SSH tunnel, because it could not reach or of the host.

Unfortunately PhpStorm doesn’t provide a way to alter the listening IP addresses in the preferences, so we were left with either using an SSH tunnel to allow port forwarding of the listening port (10137) back to the host, or manually informing Zend Debugger where the IDE would be located.

Zend Debugger Tweak

By default Zend Debugger will automatically attempt to detect the IDE settings, as shown below:

Screenshot from 2016-04-04 16:23:04

However, this wasn’t working because PhpStorm was not reporting a usable IP address, so we needed to update the settings manually:

Screenshot from 2016-04-04 16:22:37

NOTE: Checking the box “Use browser’s IP Address” did not fix the issue. The IP address needed to be entered.

With this done, the server now knew where to reach the IDE for debugging sessions. One downside to this is if the host machines IP address changes, this setting will need to be updated.

This post is one in a series on debugging. For others click below:

Setting up step debugging in Zend Studio
Using an SSH tunnel to step debug through a firewall
Setting up local step debugging with PhpStorm

Edit: Please head out to the PhpStorm ticket system and +1 this fix to make this a thing of the past.

SunshinePHP 2016 Recap

The Good

SunshinePHP 2016 was an awesome event! Not only were we sold out of tickets for the 4th year in a row, but the attendee list was truly amazing! Each year more and more companies in South Florida send most if not all of their PHP developers to the conference. This year we saw at least 20 companies in South Florida send 5 or more of their developers, and around 8 of those sent around 10. We love seeing our work take hold, and with this many companies embracing the conference it is obvious we are doing a good job. Thanks to all for participating.

SunshinePHP CrowdsThis year we had 14 of our amazing 19 sponsors represented in the exhibitor area, handing out Lego pieces and speaking with developers about how they could help them enhance their careers in one way or another. We are happy that every sponsor raved about the event, attendees, the amount of contacts they made, and the overall organization of the conference.

SunshinePHP exhibitor areaAttendees told us they loved the Lego puzzle idea, and really enjoyed collecting the Legos from the sponsors.

We had some amazing talks and keynotes this year, and really pulled some topics that were outside the box we typically see at PHP conferences. Two talks were about the brain and mental functionality, and how rest and downtime can affect our thought processes and how we learn. There were talks about dealing with customers, and how to help them help us. The keynote speakers shared tips on collaboration and teamwork while sharing stories about Pacific Ocean crossing, and growing up with physical and/or mental disabilities.

Or course these off-the-wall, but very valuable, subjects joined our already mind blowing lineup of topics and speakers.

We also had a very gender diverse attendee and speaker lineup with 16 female speakers (or 36%) and around 20% female attendees! This is a step in a very positive direction, and SunshinePHP continues to lead the way through non-biased speaker selection and responsible marketing.

The menu each day was slightly altered from previous years, with some healthier choices. The quality of the food was another nice touch as the venue really stepped up to provide some tasty items.

Evening events went well with games and panel discussions about API building indoors, and an open bar with some food items outdoors on the pool patio. (Yes, it was nice and warm.)

SunshinePHP tasty food

Overall the event went amazingly well.

The Bad

We didn’t receive too many complaints in our feedback from the event. Some mentioned that the temperature in one room was a bit cold for awhile. Others mentioned that we could have added the technical levels of the talks on the printed schedule. (We had them on the site, but overlooked adding it to the printed materials.)

One complaint, which we loved, was that we made it very difficult to improve the event for next year. 😉

The Ugly

Yes, unfortunately there was some ugly. With the recent awareness of codes of conduct and with the increase in gender diversity there is bound to be more visibility as victims come forward rather than remaining hidden. (Because even though we didn’t hear about these incidences in the past, they were already happening.) We are relieved to report that each incident below was handled professionally, and to the satisfaction of the victims.

One report was about a male attendee offering 2 separate female attendees a private sampling of relaxation techniques in his room. And when the women refused the man did not continue or push. When the incidences was brought to the man as being inappropriate he apologized and said he meant well, and he would not do it again.

A second report was made about a man in the pool area, long after the conference had ended for the day, who approached the girlfriend of an attendee and flirtatiously claimed that she could do better than her current boyfriend. We recommended that the man retire to his room (to prevent an assault) and get some rest for the next day, which he did. Nothing further was said, and no additional actions were taken.

There was a third incident reported which took place before the conference actually started, but was reported after the conference ended. A male offered to take a female shopping some distance away from the venue. Allegedly, while they were shopping the man touched the woman in an inappropriate manner. Because of the lateness of the report there were no further actions.

In a fourth report, allegedly a woman was swimming with a group, long after the conference had ended for the day, and one of the men in the group touched her in an inappropriate manner. The following morning this was brought to our attention as a 3rd party story by someone who was not present. We spoke with the man, who remained in his room except for meals over the remainder of the conference.

And finally in a fifth incident, also reported by a woman but late into the following day, it was stated that a man in the pool area the night before was over-aggressively tugging on the straps of her swimsuit. The apologetic man was questioned and promised to refrain from such activities in the future. The woman said this was an acceptable outcome.

My desire, and the reason I am being open about these incidences is to help others. Other conferences need to be aware this happened, so they can also keep their attendees safe. And attendees need to know about these things so they can watch for it, report it early, and help keep each other safe. Because whether we admit it or not, these types of activities happen everywhere. If you organize an event or group, please do not fool yourself into thinking your event is immune.


While SunshinePHP was very organized, and was an awesome event, sometimes things can happen that are out of an organizer’s control. I feel the SunshinePHP staff did everything in their power to ensure the safety of our attendees. We are looking forward to next year.

The 2015 Slack vs IRC debate rages on

irc-v-slackIt seems that 2015 will likely be partially remembered as the year IRC zealots raged against those using Slack instead of the old reliable, and still growing daily, IRC chat. And it is turning out to be as lively as the “tabs versus spaces” debate that never seems to end.

Of course this means I am only left with one solution…it’s time for me to create a blog post to commemorate this seemingly HUGE issue, and make my thoughts known.

The answer is, I use both depending on circumstances.

For those who aren’t aware (shame on you), IRC (internet relay chat) allows the creation of “chatrooms” where folks can get together to share common interests. And thanks to many individuals and companies providing servers for the cause, it is free. Freenode has been around for more than 15 years.

IRC for all of it’s greatness is also fairly bland, and is pretty much just chat, and while many people use it there is still not much to make it “sticky”. For some this may be perfect because there is less “noise”, but for others there is not enough to warrant their attention.

Lately there is a new kid on the block called Slack.

Slack had a bumpy beginning as a failed startup. The app was likely doomed to be discontinued and never see the light of day as a private resource for companies, because nobody was using it. So as a last ditch effort the company decided to open it to the public, where it boomed to become a regular part of many projects by companies and open source projects and/or communities.

Not only does Slack perform the same activities as IRC, but it also includes the ability to integrate information from outside sources. For instance, via connectors you can pull in RSS feeds from pretty much anything that provides RSS, Tweets and Retweets by certain accounts, Facebook content, IRC content, Github comments and notices, news and announcements from virtually anywhere, and much more. In short, you can create a one stop portal with tons of information relevant to your “Team” which makes Slack a place where everyone can get together and share at a much higher degree than with traditional IRC.

So, what is the problem you may ask? The answer would be that Slack is not entirely free (though there is a free level), and if Slack were to change their pricing model or if they closed entirely all is lost. Communities, projects, and all these things created around this great platform disappears. There are no options to kick up your own server retaining the content, or any other alternative to carry on without the Slack company.

Those who are speaking up against using Slack for things like User Groups and OSS projects are voicing a valid concern because history and entire communities could be lost forever if Slack were used and evil things happen. This is a valid concern, and I was one of those people, until recently, which I will share in a moment.

However, on the other side of the issue is this: Though IRC is still growing and is not really being hurt by Slack, a vast majority of people simply don’t want to use it. Not because of anything malicious, but because a well set up Slack Team can become such a wonderful thing.

I organize the South Florida PHP User Group (SoFloPHP), and a long time ago I created the #soflophp chatroom on IRC Freenode. Then I promoted it heavily to the group of 800 members over and over and over again, and even posted it on the group website. Yet, at best we only had 2 or 3 people in the chat at any one time…BORING!

Recently a member, and now co-organizer, of the group asked if we could create a Slack team for the SoFloPHP user group. I was initially against it and voiced my concern as well as pointing out that there was already an IRC chatroom for the group. But the member was persistent, so I reluctantly agreed. And WOW!

Now to be fair, the Slack Team likely would have been a failure also because in Slack you need to invite every person into the team. There is not a way for folks to just join in, as with IRC. However, there is a handy app (Slackin) you can post on a server that allows people to enter their email address for an auto invite to the Team. We simply posted the app on a free Heroku instance and were off and running.

The problem of getting people into the Slack Team was handled, but how to make it better than IRC and ensure it was used? I then created a couple of Channels within the Team. One was for “Social” which I then created a couple of connectors to some relevant Twitter accounts. This kept fresh content, announcements, and relevant updates automatically flowing in to keep everyone informed and encourage discussion. Then I created a “Jobs” Channel to do the same, but with posts from our user group jobs board at And I also created a feed to the “Random” Channel from the Reddit /r/php hot board to infuse news and updates relevant to PHP. (Note: While Reddit can create an overload of posts, it does seem to promote chat around some of the posts in the General Channel.)

Now that we are using Slack as the user group communication portal (in addition to for the group management) we’ve noticed a much higher level of activity in the group. There are 50’ish members after only a couple of months, and the usage is growing instead of staying stagnant as the IRC did for a few years.

So the bottom line for me: Without paid services like our user group would not be what it is, and it seems that Slack has enabled us to become more active. I will continue using both, until they no longer work. Because the bottom line is that the group was created to serve the community, and Slack seems to do that for now.

Run Geek Radio launch

Run Geek Radio
Run Geek Radio

Last week was the official release of Run Geek Radio, and my first podcast episode. The podcast can be found at, and also on iTunes at On the site behind the podcast you can also go to the Subscribe page for more subscription options.

My plans behind the podcast is to bring together two things I love to do…programming, and running. It only makes sense that I would want to share in both areas, and a podcast is a great way to do that. With the resurgence of podcasts lately I felt a little bit of peer pressure to attempt my own, and so far I have received wonderful reviews from PHP developers who also run, or runners who are also programmers.

So please go and check it out, and let me know what you think. Thanks.